使用类似的类进行排序

时间:2011-02-27 16:38:53

标签: java sorting comparable

我只是不确定如何解决这个问题。这是我收到的错误消息:

Exception in thread "main" java.lang.NullPointerException
    at java.util.Date.getMillisOf(Date.java:939)
    at java.util.Date.compareTo(Date.java:959)
    at FirstOccComparator.compare(FirstOccComparator.java:11)
    at FirstOccComparator.compare(FirstOccComparator.java:1)
    at java.util.Arrays.mergeSort(Arrays.java:1270)
    at java.util.Arrays.mergeSort(Arrays.java:1281)
    at java.util.Arrays.mergeSort(Arrays.java:1281)
    at java.util.Arrays.mergeSort(Arrays.java:1281)
    at java.util.Arrays.mergeSort(Arrays.java:1281)
    at java.util.Arrays.mergeSort(Arrays.java:1281)
    at java.util.Arrays.mergeSort(Arrays.java:1281)
    at java.util.Arrays.mergeSort(Arrays.java:1281)
    at java.util.Arrays.mergeSort(Arrays.java:1281)
    at java.util.Arrays.sort(Arrays.java:1210)
    at Planner.sort(Planner.java:62)
    at Test.main(Test.java:81)

测试@第81行:

p.sort( new FirstOccComparator() );

其中p是我制作的策划者类。

Planner.sort @第62行:

public void sort(Comparator<AbstractEvent> c) {
        Arrays.sort(schedule, c);
    } 

这是我的FirstOccComparator类: http://pastebin.com/4FZv4nXf (贴在pastebin上因为它太宽而且很难在这里格式化)。 在此类中,如果事件有更多的重复,则hasMoreOccurrences()返回true / false。 nextOccurrence()返回下一次出现的日期。

我很确定我在这里缺少的非常简单,我仍然是接口和比较器类的新手。

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

您尚未共享的代码中有一个null Date对象...

请注意,您可以减小比较器的大小。基本上你正在做的是说

if (x<0)
  result = -1;
else if (x==0)
  result = 0;
else if (x>0)
  result = 1;

为什么不只是说result = x;或者在你的特定例子中:

public int compare(AbstractEvent event1, AbstractEvent event2) {        
  int result = 0;       
  if (event1.hasMoreOccurrences() && event2.hasMoreOccurrences())
    result = event1.nextOccurrence().compareTo(event2.nextOccurrence());
  return result;
}

这可以再次缩短(如果这是你的风格)到一行:

public int compare(AbstractEvent event1, AbstractEvent event2) {        
  return (event1.hasMoreOccurrences() && event2.hasMoreOccurrences()) ? event1.nextOccurrence().compareTo(event2.nextOccurrence()) : 0;
}

答案 1 :(得分:3)

您的日程表数组是否为null Date对象?

编辑:我的意思是......一些“nextOccurence”返回一个null,它在java.util.Date类的“compareTo”上失败,因为“compareTo”调用“java.util.Date.getMillisOf”,使用Date的实例变量。

答案 2 :(得分:1)

您正在营地的其中一个事件返回的nextOccurreence为null。修复比较器(或AbstractEvent类)以处理这种情况。

请注意,比较器的代码比它应该更复杂。你可以把它减少到

import java.util.Comparator;

public class FirstOccComparator implements Comparator<AbstractEvent> {
    public int compare(AbstractEvent event1, AbstractEvent event2) {        
        int result = 0;         
        if (event1.hasMoreOccurrences() && event2.hasMoreOccurrences()) {
            result = event1.nextOccurrence().compareTo(event2.nextOccurrence());
        }           
        return result;  
     }   
}