Windows 10家庭中文版,java version "1.8.0_152",Eclipse Oxygen.1a Release (4.7.1a),
參考鏈接:http://www.runoob.com/java/arrays-search.html
本文是在 抄寫 了參考鏈接中的程序後,發現了一些自己之前不曉得的 基礎知識 而寫。
原文提供了 int[]數組 的排序(java.util.Arrays類的sort函數)(默認順序——升序),排序後,使用java.util.Arrays類的binarySearch查找數組中 已存在的元素,並得到其位置。
本來自己是想添加 倒序排序 的功能,可是,Arrays類提供的函數中,沒有方法對 int[]數組 進行排序,之前知道的sort函數可以有第二個參數——Comparator參數,可是,此參數僅支持引用類型,而int並非應用類型。無法對 int[]數組 進行倒序排序,那麼,就對 Integer[]數組 進行倒序排序。
對 int[]數組 怎麼進行倒序排序呢?目前的想法:自己寫算法實現,或者,使用Arrays.sort排序後,再使用循環顛倒排序元素。
下面的代碼是第一次實現 Integer[]數組 倒序排序的代碼:用到了 java.util.Comparator、匿名內部類,,稍候會對其進行改進。
1 import java.util.Arrays; 2 import java.util.Comparator; 3 4 public class SortArray { 5 6 public static void main(String[] args) throws Exception { 7 int array[] = {2, 5, -2, 6, -3, 8, 0, -7, -9, 4}; 8 Arrays.sort(array); 9 10 printArray("數組排序結果爲:", array); 11 int index = Arrays.binarySearch(array, 2); 12 System.out.print("元素2在第 " + index + " 個位置"); 13 14 // 倒序排列 15 Integer[] array2 = {2, 5, -2, 6, -3, 8, 0, -7, -9, 4}; 16 Arrays.sort(array2, new Comparator() { 17 18 @Override 19 public int compare(Object o1, Object o2) { 20 Integer e1 = (Integer)o1; 21 Integer e2 = (Integer)o2; 22 23 return e1 > e2?-1:1; 24 } 25 26 }); 27 printArray2("數組排序結果爲:", array2); 28 } 29 30 /** 31 * 打印int型數組 32 * @param message 33 * @param array 34 */ 35 private static void printArray(String message, int[] array) { 36 System.out.println(message + ": [length = " + array.length + "]"); 37 for (int i = 0; i < array.length; i++) { 38 if (i != 0) { 39 System.out.print(", "); 40 } 41 System.out.print(array[i]); 42 } 43 System.out.println(); 44 } 45 46 /** 47 * 打印Integer型數組 48 * @param message 49 * @param array 50 */ 51 private static void printArray2(String message, Integer[] array) { 52 System.out.println(message + ": [length = " + array.length + "]"); 53 for (int i = 0; i < array.length; i++) { 54 if (i != 0) { 55 System.out.print(", "); 56 } 57 System.out.print(array[i]); 58 } 59 System.out.println(); 60 } 61 }
下圖是上面16~26行代碼截圖:
可以看出,上面的代碼存在警告信息,如下:
Multiple markers at this line
- Comparator is a raw type. References to generic type Comparator<T> should be parameterized
- Type safety: The expression of type new Comparator(){} needs unchecked conversion to conform to Comparator<?
super Integer>
- Type safety: Unchecked invocation sort(Integer[], new Comparator(){}) of the generic method sort(T[], Comparator<?
super T>) of type Arrays
泛型相關的錯誤。Comparator接口是一個泛型接口,在使用它的時候,需要指明類型T。雖然編譯、運行成功了,但是,還可以更進一步。
下面是修改後的代碼:創建匿名內部類時指定具體類型爲Integer。
Arrays.sort(array2, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 > o2?-1:1; } });
注意上面代碼的紅色部分。現在, 沒有強制類型轉換了,可以直接比較o1、o2,因爲它們的類型就是Integer。
完了嗎?沒有。還可以改造。更簡潔。
Comparator是一個函數式接口(Functional Interface),因此,可以使用lambda表達式進一步簡化(需要Java 8支持)。
改造後的代碼如下:
1 Arrays.sort(array2, (o1, o2) -> o1 > o2?-1:1);
wow!一行代碼就搞定了!的確很簡潔啊!
以上所有代碼的輸出結果如下:
數組排序結果爲:: [length = 10] -9, -7, -3, -2, 0, 2, 4, 5, 6, 8 元素2在第 5 個位置數組排序結果爲:: [length = 10] 8, 6, 5, 4, 2, 0, -2, -3, -7, -9
後記
還找Java開發呢,先好好練練基礎吧!剛剛居然還在lambda表達式裏面添加 return,真是笑死自己了!
寫篇博文,讓自己記得更牢固一些,而且可以探索更多內容——寫博文之前沒想過用lambda的,現在用了,滿足了。