Так у меня есть строка кода вроде следующего: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);
}
добавить условие для '' '' '' '' '' '' 'дисквалифицированы, и снова попробуйте t – user902383
@ user902383 Ничего себе, это сработало! Хотя я и понятия не имею, почему. Если вы добавите его в качестве ответа, я подниму его и соглашусь. :) – asteri
Это также потому, что вы использовали && - если первое выражение ложно, второе не выполняется. И наоборот, для || – MihaiC