Java中数组的基本操作——下面开始我的表演
前言
上一期介绍了Java中的数组,本期来一起了解一下对数相关的基本操作。
希望有所帮助!!!(本文中若有任何错误观点,敬请路过的大佬不吝赐教,感激不尽。)
java.util包Arrays类包含了用来操作数组(如排序和搜索)的各种方法。本期一起来了解一下。
一、遍历数组
遍历数组说白了就是获取数组中的每一个元素。通常遍历数组都是使用for循环结构来实现
1.1遍历一维数组
遍历一维数组so easy,也很好理解(哎呀,原来我还会英语呢。666)。
代码示例:
public class Test25 { //创建类
public static void main(String[] args) { //主方法
int[] num = new int[]{1,3,5,7,9}; //创建一个int类型的数组num
System.out.println("遍历后的结果为:");
for (int i = 0; i < num.length; i++) { //使用for循环遍历数组num
System.out.print(num[i] + "\t");
}
}
}
运行结果:
1.2遍历二位数组
遍历二维数组需要使用双层for循环,通过数组的length属性可以获得数组的长度。
代码示例:
public class Test26 { //创建类
public static void main(String[] args) { //主方法
int num[][] = new int[][]{{1},{2,3},{4,5,6}}; //创建二维数组
System.out.println("遍历后的结果为:");
for (int i = 0; i < num.length; i++) { //循环遍历二维数组中的每个元素
for (int j = 0; j < num[i].length ; j++) { //输出数组中的元素
System.out.print(num[i][j]);
}
System.out.println(); //输出空格
}
}
}
运行结果:
在遍历数组时,使用foreach语句可能或更加简单,安排一组代码,感受一下使用foreach语句遍历二维数组
代码示例:
public class Test27 { //创建类
public static void main(String[] args) { //主方法
int arr[][] = new int[][]{{1,3},{2,4}}; //创建二维数组
System.out.println("数组中的所有元素在这里:");
int i = 0; //定义一个int类型的变量i,作为外层循环的计数装置
for (int x[]:arr) { //外层循环变量为一维数组
i++; //外层计数装置递增
int j = 0; //定义一个int类型的变量j,作为内层循环的计数器
for (int y:x) { //循环遍历每一个数组元素
j++; //内层计数装置递增
if (i == arr.length && j == x.length) { //判断变量是二维数组中的最后一个元素
System.out.print(y); //输出二位数组的最后一个元素
}else{
//如果不是二维数组中的最后一个元素
System.out.print(y + "、");
}
}
}
}
}
运行结果:
二、填充替换数组元素
数组中的元素定义完成后,可以通过Arrays类的静态方法fill()来对数组中的元素进行替换。该方法通过各种重载形式完成对任意类型的数组元素进行替换。
2.1fill(int[] arr,int value)
该方法可将指定的int值分配给int型数组的每个元素
语法如下:
fill(int[] arr, int value)
- arr:要进行替换的数组
- value:要存储数组中所有元素的值
安排一段代码,实现通过fill方法填充数组元素,最后将数组中的各个元素输出。
代码示例:
import java.util.Arrays; //记得导包
public class Test28 { //创建类
public static void main(String[] args) { //主方法
int arr[] = new int[5]; //创建一个一维数组
Arrays.fill(arr,8); //使用同一个值对数组进行填充
for (int i = 0; i < arr.length; i++) { //循环遍历数组中的元素
System.out.println("第" + i + "个元素是:" + arr[i]); //将数组中的元素一次输出
}
}
}
运行结果:
2.2 fill(int[] a,int fromIndex,int toIndex,int value)
该方法是将指定的int值分配给int型数组指定范围中的每个元素。填充的范围从索引formIndex(包括)一直到索引toIndex(不包括)。如果fromIndex == toIndex,则填充范围为空。
语法:
fill(int[] arr,int fromIndex,int toIndex,int value)
- arr:要进行填充的数组
- fromIndex:要使用指定值填充的第一个元素的索引(包括)
- toIndex:要使用指定的值填充的最后一个元素的索引(不包括)
- value:要存储在空数组所有元素中的值
安排一段代码。创建一维数组,通过fill()方法替换数组元素,然后输出数组中的元素。
代码示例:
import java.util.Arrays; //导包
public class Text29 { //创建类
public static void main(String[] args) { //主方法
int arr[] = new int[]{10,15,20,25}; //创建数组
Arrays.fill(arr,1,2,8); //用fill()方法对数组进行初始化
for (int i = 0; i < arr.length; i++) { //遍历
System.out.println("第" + i + "个元素是:" + arr[i]); //输出
}
}
}
运行结果:
注意:
如果指定的索引位置大于或者等于要进行填充的数组的长度,则会报出ArraysIndexOutOfBoundsException异常(数组越界异常)。
三、对数组进行排序
对数组的排序应用的还是Arrays类,不过用到是sort()方法来实现对数组的排序。sort()方法提供了多种重载的方式,可对任意类型的数组进行升序排序。
语法:
Arrays.sort(object);
- List item
- Object是指进行排序的数组名称
安排上一段代码,创建一维数组,将数组排序后输出。
代码示例:
import java.util.Arrays;
public class Test30 { //创建类
public static void main(String[] args) { //主方法
int arr[] = new int[]{2,6,8,4,10}; //创建数组
Arrays.sort(arr); //将数组进行排序
for (int i = 0; i < arr.length; i++) { //遍历
System.out.println(arr[i]); //输出
}
}
}
运行结果:
注意:
Java中的String类型数组的排序算反是根据字典编排顺序排序的,因此受罪排在字母前,大写字母排在小写字母前面。
四、复制数组
Arrays类的copyOf()方法与copyOfRange()方法可以实现对数组的复制。copyOf方法是复制数组至指定长度,copyOfRange()方法则将指定数组的指定长度复制到一个新数组中。
4.1copyOf()方法
该方法提供了多种重载方式,用于满足不同类型数组的复制
语法:
copyOf(arr,int newlength)
- arr:要进行复制的数组
- newlength:int常量,指复制后的新数组长度。如果新数组的长度大于数组arr的长度则用0填充(根据复制数组的类型来决定填充的值,整型数组用0填充,char类型数组则使用null来填充);如果复制后的长度小于数组arr的长度,则会从数组arr的第一个元素开始截取至满足新数组长度为止。
安排一组代码,实现将此数组复制得到一个长度为5的新数组,并输出新数组
代码示例:
import java.util.Arrays; //导包
public class Test31 { //创建类
public static void main(String[] args) { //主方法
int arr[] = new int[]{1,3,5}; //创建数组
int newarr[] = Arrays.copyOf(arr,5); //复制数组arr
for (int i = 0; i < newarr.length; i++) { //循环变量复制后的新数组
System.out.println(newarr[i]); //将新数组输出
}
}
}
运行结果:
4.2 copyOfRange()方法
该方法同样提供了多种重载方式。
语法:
copyOfRange(arr,int formIndex,int toIndex)
- arr:要进行复制的数组
- fromIndex:指定开始复制数组的索引位置。fromIndex必须在0至整个数组的长度之间。新数组包括索引是fromIndex的元素。
- toIndex:要复制范围的最后索引位置。可大于数组arr的长度。新数组不包括索引是toIndex的元素
安排一段代码:创建一维数组,并且将数组中索引位置是0~5之间的元素复制到新数组中,最后将新数组输出。
代码示例:
import java.util.Arrays; //导包
public class Test32 { //创建类
public static void main(String[] args) { //主方法
int arr[] = new int[]{1,3,5,7,9,11,13}; //创建数组
int newarr[] = Arrays.copyOfRange(arr,0,3); //复制数组
for (int i = 0; i < newarr.length; i++) { //遍历新数组
System.out.print(newarr[i] + "\t"); //输出
}
}
}
运行结果:
五、数组查询
Arrays类的binarySecrch()方法可使用二分搜索法来搜索指定的数组以获得对象。该方法返回要搜索元素的索引值。binarySecrch()方法提供了多种重载形式用于满足各种类型数组查找需要,该方法有两种参数返回值。
5.1 binarySecrch(Object[],Object key)
语法:
binarySecrch(Object[]a,Object key)
- arr:要搜索的数组
- key:要搜索的值
如果key包含在数组中,则返回搜索值的索引,否则返回-1或者“-”(插入点)。插入点是搜索键将要插入数组的那一点,即第一个大于此键的元素索引。
例如:
int arr[] = new int[]{5,15,10}; //创建数组
Arrays.sort(arr); //进行排序
Int index = Array.binarySearch(arr,0,1,3);
如果数组中的所有元素都小于指定的键,则为a.length。这保证了当且仅当此键被找到时,返回值将大于等于0。
走一段代码,一起感受一下。创建一个数组,实现查找元素4在数组中索引位置。
代码示例:
import java.util.Arrays;
public class Test33 { //创建类
public static void main(String[] args) { //主方法
int arr[] = new int[]{1,5,7,2,4,8}; //创建数组
Arrays.sort(arr); //对数组进行排序
int index = Arrays.binarySearch(arr,4); //查找arr中元素4的索引位置
System.out.println("4的索引位置是:" + index); //输出
}
}
运行结果:
4的索引就位置是进行排序后的索引位置。
注意:
必须在进行此调用之前使用sort()方法对数组进行排序,如果没有对数组进行排序,则结果是不确定的。如果数组包含多个带有指定值的元素,则无法保证找到的值是哪一个。
5.2 binarySearch(Object[] ,int fromIndex, int toIndex,Object key)
该方法在指定的范围内检索某一元素
语法:
binarySearch(Object[] arr,int fromIndex, int toIndex,Object key)
- a:要进行检索的数组
- fromIndex:指定范围的开始处索引(包含)
- toIndex:指定范围的结束处索引(不包含)
- key:要搜索的元素
使用该方法前同样要对数组进行排序来获得精确的索引值。如果要搜索的元素key在指定的范围内则返回搜索键的索引,否则返回-1或者“-”(插入点)。如果范围中所有元素都小于指定的键,则为toIndex。这保证了当且仅当此键被找到时,返回的值将大于等于0。
代码示例:
import java.util.Arrays;
public class Test34 { //创建类
public static void main(String[] args) { //主方法
String str[] = new String[]{"ab","ef","cd","mn"}; //创建数组
Arrays.sort(str); //对数组进行排序
//在指定的范围内搜索元素“cd”的索引位置
int index = Arrays.binarySearch(str,0,2,"cd");
System.out.println("ef的索引位置是:" + index); //输出
}
}
运行结果:
注意:
如果指定范围大于或等于数组长度,则会爆出ArraysIndexOutOfBoundsException异常。
希望有所帮助!!!
关注我,持续更新!!!