Я в процессе обновления нашего проекта до java 7. Я столкнулся с исключением Illegal Argument для Collections.sort(). Я знаю, что причиной исключения является новый Timsort в java 7 (я действительно бросал все вопросы, поднятые ранее по этому вопросу). Теперь мне нужно изменить логику сравнения, чтобы преодолеть это исключение. Вот мой метод сравненияJava 7: java.lang.IllegalArgumentException: метод сравнения нарушает его общий контракт
if (o1.isLookup() && !o2.isLookup()) {
return -1;
}
if (!o1.isLookup() && o2.isLookup()) {
return 1;
}
if (o1.dependsOn(o2)) {
return 1;
}
if (o2.dependsOn(o1)) {
return -1;
}
return 0;
Я попытался перекрывая равный() метод, с той же логикой, как сравнивать, думать, если сравнить равные и возвращать тот же результат, он должен решить эту проблему; но это не сработало, как ожидалось.
Когда я разделил метод сравнения на два с отдельными компараторами, как показано ниже, сортировка (с использованием обоих компараторов) не вызывает никаких исключений. Что может быть возможной причиной?
код ниже:
protected Comparator<EntityWrapper> getComparator2() {
return new Comparator<EntityWrapper>() {
public int compare(EntityWrapper o1, EntityWrapper o2) {
if (o1.dependsOn(o2.entityClass)) {
// This depends on otherWrapper
return 1;
}
if (o2.dependsOn(o1.entityClass)) {
// OtherWrapper depends on this
return -1;
}
return 0;
}
};
}
protected Comparator<EntityWrapper> getComparator1() {
return new Comparator<EntityWrapper>() {
public int compare(EntityWrapper o1, EntityWrapper o2) {
if (o1.isLookup() && !o2.isLookup()) {
return -1;
}
if (!o1.isLookup() && o2.isLookup()) {
return 1;
}
return 0;
};
}
возможно, что 'o1.dependsOn (o2) и' o2 .dependsOn (o1) 'оба являются истинными? – Henry
Трудно комментировать, если мы не увидим, что здесь делает метод 'dependsOn' и' isLookup'. –
Невозможно говорить для вашего конкретного примера, но убедитесь, что ваша функция сравнения относится к понятию строгого слабого упорядочения. То есть, если a a и тому подобное. –