Java基礎:整型數組(int[]、Integer[])排序

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的,現在用了,滿足了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章