繁体   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