[英]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.