2

Так у меня есть строка кода вроде следующего:Collections.sort() работает, но Collections.reverseOrder() разбивает

Collections.sort(lists, new SpecificComparator()); 

работает отлично. Но когда я пытаюсь получить его в порядке убывания ...

Collections.sort(lits, Collections.reverseOrder(new SpecificComparator())); 

... он ломает со следующими исключениями:

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

Когда я искал сообщение Exception, я нашел this Q&A, заявив, что это связано с тем, что отношения не были транзитивными. Наверное, я немного смущен тем, как отношения могут быть транзитивными в одном направлении, а не в другом. Мое понимание транзитивности A == B && B == C -> A == C, так что ...

Вот мой компаратор:

public class SuperComparator implements Comparator<Item> { 

    @Override 
    public int compare(Item first, Item second) { 
     Result a = first.getResult(); 
     Result b = second.getResult(); 
     if(a == null && b == null) return 0; 
     if(b == null || b == Result.DISQUALIFIED) return 1; 
     if(a == null || a == Result.DISQUALIFIED) return -1; 
     return b.getIntValue() - a.getIntValue(); 
    } 

} 

...

public class SpecificComparator extends SuperComparator { 

    @Override 
    public int compare(Item first, Item second) { 

     int rank = super.compare(first, second); 

     if(rank != 0) return rank; 

     BigDecimal thisAmount = first.getAmount() != null ? first.getAmount() : BigDecimal.ZERO; 
     BigDecimal otherAmount = second.getAmount() != null ? second.getAmount() : BigDecimal.ZERO; 

     return thisAmount.compareTo(otherAmount); 
    } 
+0

добавить условие для '' '' '' '' '' '' 'дисквалифицированы, и снова попробуйте t – user902383

+0

@ user902383 Ничего себе, это сработало! Хотя я и понятия не имею, почему. Если вы добавите его в качестве ответа, я подниму его и соглашусь. :) – asteri

+0

Это также потому, что вы использовали && - если первое выражение ложно, второе не выполняется. И наоборот, для || – MihaiC

ответ

4

Если оба ваших товаров дисквалифицированы, ваш компаратор всегда будет возвращать 1 , и это неправильно.

проверка добавить для случая, когда обе ваши детали дисквалифицированы и ваша проблема будет решена

1

Ваш компаратор, конечно, не транзитивно.

Убедитесь, что для 3 элементов A, B и C, если A> B и B> C, то A> C; то вы будете в порядке