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

时间:2014-12-18 21:33:50

标签: java arrays sorting compareto

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

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}} ints的平均值对数组进行排序。我有一个工作方法来返回这个但是当我尝试使用int[]compareTo对数组进行排序时,我会从这些开始得到一长串错误:

Arrays.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) 方法看起来像这样,它位于实现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元素的数组进行排序。有什么办法可以实现吗?

5 个答案:

答案 0 :(得分:12)

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

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

如果您想要的话,请使用nullsLast

答案 1 :(得分:9)

您需要自己的Comparator实现并检查空值并返回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);
    }});

答案 2 :(得分:2)

您必须创建Comparator<FClass>,而不是使用Comparable<FClass>

public class FClassComparator implements Comparator<FClass> 
{
    public int compare(FClass left, FClass right) {
        // Swap -1 and 1 here if you want nulls to move to the front.
        if (left == null) return right == null ? 0 : 1;
        if (right == null) return -1;
        // you are now guaranteed that neither left nor right are null.

        // I'm assuming avg is int. There is also Double.compare if they aren't.
        return Integer.compare(left.avg, right.avg); 
    }
}

然后通过以下方式调用sort:

Arrays.sort(fClassArray, new FClassComparator());

答案 3 :(得分:0)

使用Apache Commons Collections 4,您可以使用ComparatorUtils执行此操作:

Collections.sort(arr, ComparatorUtils.nullLowComparator(ComparatorUtils.NATURAL_COMPARATOR));

答案 4 :(得分:0)

导入的org.apache.commons.collections.comparators包  Apache 2.1.1 Release库,我可以使用ArrayList<String>作为NullComparator方法的第二个参数对列表进行排序,例如Collections.sort(),如下所示:

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有一个重载构造函数,它允许你指定是否要将null视为高值或低值,这看起来非常直观对我来说。

NullComparator(boolean nullsAreHigh)

希望这有助于某人!