Сортировка с использованием сопоставимого класса - PullRequest
0 голосов
/ 27 февраля 2011

Я просто не уверен, как подойти к этой проблеме. Это сообщение об ошибке, которое я получаю:

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)

Test @ line 81:

p.sort( new FirstOccComparator() );

где p - класс планировщика, который я создал.

Planner.sort @ line 62:

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

Это мой класс FirstOccComparator: http://pastebin.com/4FZv4nXf (размещено на pastebin, потому что оно было слишком широким и его было трудно отформатировать здесь). В этом классе hasMoreOccurferences () возвращает true / false, если есть больше повторений события. nextOccurrence () возвращает дату следующего вхождения.

Я почти уверен, что мне здесь не хватает, очень просто, я все еще новичок в интерфейсах и классах компараторов.

Спасибо за помощь!

Ответы [ 3 ]

4 голосов
/ 27 февраля 2011

В коде есть нулевой объект 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;
}
3 голосов
/ 27 февраля 2011

Ваш массив расписаний имеет нулевой объект Date?

РЕДАКТИРОВАТЬ: я имею в виду ... некоторые "nextOccurence" возвращает значение NULL, которое завершается ошибкой в ​​"CompareTo" класса java.util.Date, потому что«compareTo» вызывает «java.util.Date.getMillisOf», в котором используется переменная экземпляра Date.

1 голос
/ 27 февраля 2011

Значение nextOccurreence, возвращаемое одним из событий, которые вы собираете, равно нулю.Исправьте компаратор (или класс 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;  
     }   
}
...