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

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

 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[]的平均值对数组进行sorting。 我有一个工作方法来返回这个,但是当我尝试使用compareToArrays.sortsorting数组时,我得到一个从这些开始的错误长列表:

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

我试图调用这个方法来进行sorting:

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

我已经testing了一个.txt文件,其中包含足够的条目来填充数组,并在这种情况下,sorting工作正常,所以我相信我遇到的问题是,我的sorting方法不能sorting与空元素的数组它。 有什么办法可以实现吗?

您需要自己的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); }}); 

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

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

当然,如果这就是你想要的,使用nullsLast

您必须创build一个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); } } 

然后通过以下方式拨打

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

使用Apache Commons Collections 4,你可以使用ComparatorUtils来做到这一点:

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