[英]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)
由於Integer
是Comparable
,因此您可以使用重載的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)
。 如果e1
或e2
是 null,這將引發異常。
解決方案:使用 2 參數Arrays.sort(T[], Comparator<? super t)
並提供一個能夠比較 2 個元素的Comparator
器,即使其中一個或兩個是 null。
非常簡單的例子(比較null
為0
):
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.