Arrays工具类
在java.util包中,除了针对集合操作提供了一个集合工具类Collections,还针对数组操作提供了一个数组工具类——Arrays。Arrays工具类提供了大量针对数组操作的静态方法,接下来就对其中一些常用方法进行讲解。
1.使用sort()方法排序
在前面学习数组时,要想对数组进行排序就需要自定义一个排序方法,其实也可以使用Arrays工具类中的静态方法sort()来实现这个功能,接下来通过一个案例来学习sort()方法的使用,如文件1所示。
文件1 Example27.java
1 import java.util.Arrays;
2 public class Example27 {
3 public static void main(String[] args) {
4 int[] arr = { 9, 8, 3, 5, 2 }; // 初始化一个数组
5 System.out.print("排序前:");
6 printArray(arr); // 打印原数组
7 Arrays.sort(arr); // 调用Arrays的sort()方法排序
8 System.out.print("排序后:");
9 printArray(arr); // 打印排序后数组
10 }
11 // 定义打印数组元素方法
12 public static void printArray(int[] arr) {
13 System.out.print("[");
14 for (int x = 0; x < arr.length; x++) {
15 if (x != arr.length - 1) {
16 System.out.print(arr[x] + ", ");
17 } else {
18 System.out.println(arr[x] + "]");
19 }
20 }
21 }
22 }
运行结果如图1所示。
图1 运行结果
从图1可以看出,使用Arrays的sort()方法时将会按照自然顺序对数组元素进行排序,使用非常方便。针对数组排序,数组工具类Arrays还提供了其他多个重载的sort()方法,既可以按照自然顺序进行排序,也可以传入比较器参数按照定制规则排序,同时还支持选择排序的元素范围。
2.使用binarySearch(Object[] a, Object key)方法查找元素
程序开发中,经常会在数组中查找某些特定的元素,如果数组中元素较多时查找某个元素就会非常繁琐,为此,Arrays工具类中还提供了一个binarySearch(Object[] a, Object key)方法用于查找元素,接下来通过一个案例来学习该方法的使用,如文件2所示。
文件2 Example28.java
1 import java.util.Arrays;
2 public class Example28 {
3 public static void main(String[] args) {
4 int[] arr = { 9, 8, 3, 5, 2 };
5 Arrays.sort(arr); // 对数组进行排序
6 int index = Arrays.binarySearch(arr, 3); // 查找指定元素3
7 System.out.println("元素3的索引是:" + index);
8 }
9 }
运行结果如图2所示。
图2 运行结果
从图2可以看出,使用Arrays的bianrySearch(Object[] a, Object key)方法查找出了3在数组中的索引为1(排序后的数组索引)。需要注意的是,bianrySearch()方法只能针对排序后的数组进行元素查找,因为该方法采用的是二分法查找。所谓二分法查找就是每次将指定元素和数组中间位置的元素进行比较,从而排除掉其中的一半元素,这样的查找是非常高效的。接下来通过一个图例来演示二分法查找元素的过程,如图3所示。
图3 二分查找法
图3中的start、end和mid(mid=(start+end)/2)分别代表在数组中查找区间的开始索引、结束索引和中间索引,假设查找的元素为key,接下来分步骤讲解元素的查找过程。
第1步,判断开始索引start和结束索引end,如果start<=end,则key和arr[mid]进行比较,如果两者相等,说明找到了该元素;如果不相等,则需要进入第2步继续比较二者的大小。
第2步,将key和arr[mid]继续进行比较,如果key<arr[mid],表示查找的值处于索引start和mid之间,这时执行第3步;否则表示要查找的值处于索引mid和end之间,这时执行第4步。
第3步,将查找区间的结束索引end置为mid-1,开始索引不变,中间索引mid重新置为(start+end)/2,继续查找,直到start>end,表示查找的数组不存在,这时执行第5步。
第4步,将查找区间的开始索引start置为mid+1,结束索引不变,中间索引mid重新置为(start+end)/2,继续查找,直到start>end,表示查找的数组不存在,这时执行第5步。
第5步,返回“(插入点)-(start+1)”。这个“插入点”指的是大于key值的第一个元素在数组中的位置,如果数组中所有的元素值都小于要查找的对象,“插入点”就等于“-array.length”。
3.使用copyOfRange(int[] original, int from, int to)方法拷贝元素
在程序开发中,经常需要在不破坏原数组的情况下使用数组中的部分元素,这时可以使用Arrays工具类的copyOfRange(int[] original,int from,int to)方法将数组中指定范围的元素复制到一个新的数组中,该方法中参数original表示被复制的数组,from表示被复制元素的初始索引(包括),to表示被复制元素的最后索引(不包括),接下来通过一个案例来学习如何拷贝数组,如文件3所示。
文件3 Example29.java
1 import java.util.Arrays;
2 public class Example29 {
3 public static void main(String[] args) {
4 int[] arr = { 9, 8, 3, 5, 2 };
5 // 复制一个指定范围的数组
6 int[] copied = Arrays.copyOfRange(arr, 1, 7);
7 for (int i = 0; i < copied.length; i++) {
8 System.out.print(copied[i] + " ");
9 }
10 }
11 }
运行结果如图4所示。
图4 运行结果
文件3中,使用Arrays的copyOfRange(arr, 1, 7)方法将数组{ 9, 8, 3, 5, 2 }中从arr[1](包括开始索引对应的元素)到arr[7](不包括结束索引对应的元素)这6个元素复制到新数组copied中,由于原数组arr 的最大索引为4,因此只有arr[1]到arr[4]这四个元素“8,3,5,2”复制到了新数组copied中,另外两个元素放入了int类型数组的默认值0。
4.使用fill(Object[] a, Object val)方法替换元素
程序开发中,可能会需要将一个数组中的所有元素替换成同一个元素,此时可以使用Arrays工具类的fill(Object[] a, Object val)方法,该方法可以将指定的值赋给数组中的每一个元素,接下来通过一个案例来演示如何替换元素,如文件4所示。
文件4 Example30.java
1 import java.util.Arrays;
2 public class Example30 {
3 public static void main(String[] args) {
4 int[] arr = { 1, 2, 3, 4 };
5 Arrays.fill(arr, 8); // 用8替换数组中的每个元素
6 for (int i = 0; i < arr.length; i++) {
7 System.out.println(i + ": " + arr[i]);
8 }
9 }
10 }
运行结果如图5所示。
图5 运行结果
从图5可以看出,在调用了Arrays工具类的fill(arr,8)方法后,数组arr中的元素全部被替换为8。
Arrays工具类中还有一些其他方法,有兴趣的读者,同样可以根据需要自学API帮助文档,这里就不再介绍了。