2016-07-25 5 views
1

В настоящее время я боюсь сортировать коллекцию на Java. Я получаю сообщение об ошибке «Метод сравнения нарушает его Общий контракт». Я также понимаю это сообщение об ошибке, но я (в основном) использую buildin compareTo-Method типа Long. Поэтому я не знаю, и в этом случае метод сортировки по-прежнему нарушает контракт. Вот мой код:buildin compareTo: Метод сравнения нарушает общий контракт

@Override 
public int compareTo(DataAge another) { 
    if(this == null || another == null) 
     return 0; 

    Long a = new Long(this.getAge()); 
    Long b = new Long(another.getAge()); 
    return a.compareTo(b); 
} 

А вот ошибка:

Java exception occurred: 
java.lang.IllegalArgumentException: Comparison method violates its general contract! 

at java.util.ComparableTimSort.mergeLo(Unknown Source) 

at java.util.ComparableTimSort.mergeAt(Unknown Source) 

at java.util.ComparableTimSort.mergeCollapse(Unknown Source) 

at java.util.ComparableTimSort.sort(Unknown Source) 

at java.util.ComparableTimSort.sort(Unknown Source) 

at java.util.Arrays.sort(Unknown Source) 

at java.util.Collections.sort(Unknown Source) 

at dd.GMAAnalyzer.sortData(Analyzer.java:158) 
+0

Примечание: 'это == null' всегда ложно. –

ответ

5

Предполагая, что null s разрешено, логика вашего метода является неправильным, так как null сравнивает равно ни к чему. Это неправильно, потому что он будет сравниваться с несколькими вещами, которые не равны между собой, тем самым нарушая транзитивность.

Чтобы устранить эту проблему, решить, если null s разбирайтесь впереди или сзади других номеров, а также добавить отдельную null сравнения (this не может быть равен null, так что вам не нужен сравнение для него).

if(another == null) 
    return 1; // If you want nulls in the back, return -1 
+0

спасибо, решил проблему – Thorsten

1

От Javadoc из Comparable:

Note that null is not an instance of any class, and e.compareTo(null) should throw a NullPointerException even though e.equals(null) returns false.

Кроме того, вам не нужно создавать Long экземпляры:

return Long.compare(this.getAge(), another.getAge()); 
Смежные вопросы