数组的遍历与排序
package test;import java.util.Arrays;import java.util.Comparator;public class Main { public static void main(String[] args) { Integer[] integers = {1, 20, 90}; //遍历数组// for(int i = 0; i < integers.length; i++) {// System.out.println(integers[i]);// } //直接使用Arrays.toString方法,显示数组 System.out.println(Arrays.toString(integers));//[1, 20, 90] //演示 sort方法的使用 Integer arr[] = {1, -1, 7, 0, 89}; //进行排序 //1. 可以直接使用冒泡排序 , 也可以直接使用Arrays提供的sort方法排序 //2. 因为数组是引用类型,所以通过sort排序后,会直接影响到 实参 arr //3. sort重载的,也可以通过传入一个接口 Comparator 实现定制排序 //4. 调用 定制排序 时,传入两个参数 : // (1) 排序的数组 arr // (2) 实现了Comparator接口的匿名内部类 , 要求实现 compare方法 //5. 先演示效果,再解释 //6. 这里体现了接口编程的方式 , 看看源码,就明白 // 源码分析 //(1) Arrays.sort(arr, new Comparator() //(2) 最终到 TimSort类的 private static <T> void binarySort(T[] a, int lo, int hi, int start, // Comparator<? super T> c)() //(3) 执行到 binarySort方法的代码, 会根据动态绑定机制 c.compare()执行我们传入的 // 匿名内部类的 compare () // while (left < right) { // int mid = (left + right) >>> 1; // if (c.compare(pivot, a[mid]) < 0) // right = mid; // else // left = mid + 1; // } //(4) new Comparator() { // @Override // public int compare(Object o1, Object o2) { // Integer i1 = (Integer) o1; // Integer i2 = (Integer) o2; // return i2 - i1; // } // } //(5) public int compare(Object o1, Object o2) 返回的值>0 还是 <0 // 会影响整个排序结果, 这就充分体现了 接口编程+动态绑定+匿名内部类的综合使用 //Arrays.sort(arr); // 默认排序方法->从小到大排序 //定制排序 Arrays.sort(arr, new Comparator() { @Override public int compare(Object o1, Object o2) { Integer i1 = (Integer) o1; Integer i2 = (Integer) o2; return i2 - i1;//从大到小排序 //return i1 - i2;//从小到大排序 } }); System.out.println("===排序后==="); System.out.println(Arrays.toString(arr));//[89, 7, 1, 0, -1] }}
自定义排序理解
package test;import java.util.Arrays;import java.util.Comparator;public class Main { public static void main(String[] args) { int[] arr = {1, -1, 8, 0, 20}; //bubble01(arr); bubble02(arr, new Comparator() { @Override public int compare(Object o1, Object o2) { int i1 = (Integer) o1; int i2 = (Integer) o2; return i1 - i2;//从小到大排序 // return i2 - i1;//从大到小排序 } }); System.out.println("==定制排序后的情况=="); System.out.println(Arrays.toString(arr)); } //使用冒泡完成排序(传统方式) public static void bubble01(int[] arr) { int temp = 0; for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { //从小到大 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } //结合冒泡 + 定制 public static void bubble02(int[] arr, Comparator c) { int temp = 0; for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { //数组排序由 c.compare(arr[j], arr[j + 1])返回的值决定 if (c.compare(arr[j], arr[j + 1]) > 0) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }}
