簡體   English   中英

對 java 中的 Integer 類型數組進行排序

[英]Sorting an Integer type Array in java

如果具有 null 元素,則不能將Arrays.sort()用於Integer類型數組。 int類型數組不同, null的值未分配為 0。
如果Integer類型數組具有null元素,如何對其進行排序?

Integer[] arr=new Integer[4] {6,7,null,null};

我想對這個arr數組變量進行排序。
錯誤如下:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.lang.Comparable.compareTo(Object)" because "a[runHi]" is null
    at java.base/java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
    at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
    at java.base/java.util.Arrays.sort(Arrays.java:1040)
    at Example.medicinePriceForGivenDisease(Example.java:41)
    at Example.main(Example.java:21)

由於IntegerComparable ,因此您可以使用重載的Arrays.sort(Object[]) IE:

Integer[] arr = new Integer[4]; //not "int"
// fill in some data in arr
Arrays.sort(arr);

java.util.Arrays class 具有排序所需的所有方法,包括sort(Object[] a) 由於Integer是 object,它會做得很好:

Integer[] arr = new Integer[] { 32, 12, 9, 77 };
Arrays.sort(arr);
// Array sorted it

單個參數Arrays.sort(Object[])使用compareTo方法對必須實現Comparable接口的元素進行排序。 基本上它為數組的元素調用e1.compareTo(e2) 如果e1e2是 null,這將引發異常。

解決方案:使用 2 參數Arrays.sort(T[], Comparator<? super t)並提供一個能夠比較 2 個元素的Comparator器,即使其中一個或兩個是 null。

非常簡單的例子(比較null0 ):

var comparator = Comparator.comparingInt((Integer n) -> n==null ? 0 : n.intValue());
Arrays.sort(arr, comparator);

實現Comparator器的 class 也可用於更復雜的排序:

class MyComparator implements Comparator<Integer> {
    @Overwrite
    public int compare(Integer a, Integer b) {
        if (a == null && b == 0) return 0;
        if (a == null) return -1;
        ...  // must be implemented
    }
}


Arrays.sort(arr, new MyComparator());

在撰寫這篇文章時沒有使用或傷害 IDE; 包含的代碼僅作為如何解決問題的想法 - 它不完整,最終錯誤甚至包含編譯錯誤

List<Integer> sortedArray = Arrays.stream(arr)
                              .filter(x -> x != null)
                              .sorted().toList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM