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

Java 如何对包含空元素的对象数组进行排序?,java,arrays,sorting,compareto,Java,Arrays,Sorting,Compareto,在我的程序中,创建了一个固定长度[7]的对象数组FClass,每个对象都是一个类FClass,包含3个字符串、一个int、一个int[]。这些值从.txt文件中读取,并根据int的值添加到数组的特定索引中。.txt文件中的条目比数组中的索引少,因此数组最终看起来像这样: fClasses[0] { str1, str2, str3, int1, int [] {1,2,3,4,5}} fClasses[1] { str1, str2, str3, int1, int [] {1,2,3,4,5}

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

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}}
稍后在程序中,我需要根据
int[]
int
的平均值对数组进行排序。我有一个工作方法可以返回此值,但是当我尝试使用
compareTo
数组对数组进行排序时。排序
会得到一长串错误,从以下开始:

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)
我的
compareTo
方法如下所示,它位于实现
Comparable
的类中:

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;
    }

}

我已经用一个.txt文件对它进行了测试,该文件包含足够的条目来填充数组,在这种情况下,排序工作正常,因此我认为我遇到的问题是,我的排序方法无法对其中包含null元素的数组进行排序。有什么方法可以实现这一点吗?

您需要自己的
比较器
实现,并检查空值并返回0

 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);
    }});
Arrays.sort(fClasses,newcomparator(){
@凌驾
公共整数比较(FClass o1,FClass o2){
如果(o1==null&&o2==null){
返回0;
}
如果(o1==null){
返回1;
}
如果(o2==null){
返回-1;
}
返回o1。与(o2)相比;
}});

您必须创建一个
比较器,而不是使用一个
可比的


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

Arrays.sort(fClasses, Comparator.nullsFirst(Comparator.naturalOrder()));
当然,如果您需要,请使用
nullsLast

使用,您可以使用:

Collections.sort(arr, ComparatorUtils.nullLowComparator(ComparatorUtils.NATURAL_COMPARATOR));
通过导入 在库中,我可以使用
NullComparator
作为
Collections.sort()
方法的第二个参数对列表进行排序,例如
ArrayList
,如下所示:

ArrayList<String> list = new ArrayList<String>();
list.add("foo");
list.add("bar");
list.add("baz");
list.add(null);

// Sort the list
Collections.sort(list, new NullComparator(true));

System.out.println(list);
// outputs:
// [bar, baz, foo, null]

希望这对别人有帮助

o1==null不应该返回-1,因为null值意味着它的重要性低于实际有值的o2
Arrays.sort(fClasses, Comparator.nullsFirst(Comparator.naturalOrder()));
Collections.sort(arr, ComparatorUtils.nullLowComparator(ComparatorUtils.NATURAL_COMPARATOR));
ArrayList<String> list = new ArrayList<String>();
list.add("foo");
list.add("bar");
list.add("baz");
list.add(null);

// Sort the list
Collections.sort(list, new NullComparator(true));

System.out.println(list);
// outputs:
// [bar, baz, foo, null]
NullComparator(boolean nullsAreHigh)