如何对包含空元素的对象数组进行排序?

2022-09-03 09:57:26

在我的程序中,创建了一个固定长度[7]的对象数组,每个对象都是一个包含3,一个和一个.这些值从 .txt 文件中读取,并根据 的值添加到数组的特定索引中。.txt文件中的条目较少,然后数组中有索引,因此数组最终看起来像这样:fClassesFClassStringsintint[]int

fClasses[0] { str1, str2, str3, int1, int [] {1,2,3,4,5}}
fClasses[1] { str1, str2, str3, int1, int [] {1,2,3,4,5}}
fClasses[2] { str1, str2, str3, int1, int [] {1,2,3,4,5}}
fClasses[3] null
fClasses[4] null
fClasses[5] { str1, str2, str3, int1, int [] {1,2,3,4,5}}
fClasses[6] { str1, str2, str3, int1, int [] {1,2,3,4,5}}

稍后在程序中,我需要根据 .我有一个工作方法来返回这个,但是当我尝试使用对数组进行排序时,我得到了一长串错误,从以下开始:intsint[]compareToArrays.sort

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.util.ComparableTimSort.countRunAndMakeAscending(Unknown Source)
    at java.util.ComparableTimSort.sort(Unknown Source)
    at java.util.Arrays.sort(Unknown Source)
    at FProg.sortClasses(FProg.java:228)

我的方法看起来像这样,它位于一个实现的类中:compareToComparable

public int compareTo(FClass other) 
{
    if (other == null || this.avg == other.avg)
    {
        return 0;
    }
    else if (this.avg < other.avg)
    {
        return -1;
    }
    else
    {
        return 1;
    }

}

我正在尝试调用此方法进行排序:

public void sortClasses()
{
    Arrays.sort(fClasses, 0, MAX_CLASSES);
}

我已经使用一个包含足够条目来填充数组的.txt文件对其进行了测试,并且在这种情况下排序可以正常工作,因此我相信我遇到的问题是我的排序方法无法对包含空元素的数组进行排序。有什么办法可以做到这一点吗?


答案 1

使用 Java 8,您可以轻松构建所需的比较器:

Arrays.sort(fClasses, Comparator.nullsFirst(Comparator.naturalOrder()));

当然,如果这是你想要的,那就改用。nullsLast


答案 2

您需要自己的实现并检查 null 并返回 0Comparator

 Arrays.sort(fClasses, new Comparator<FClass>() {
    @Override
    public int compare(FClass o1, FClass o2) {
        if (o1 == null && o2 == null) {
            return 0;
        }
        if (o1 == null) {
            return 1;
        }
        if (o2 == null) {
            return -1;
        }
        return o1.compareTo(o2);
    }});