Я знаю, что об этом спрашивали много раз, но я получаю эту ошибку после выполнения операции поиска в среде, где невозможна отладка.
Я пытаюсь понять, почему мой метод сравнениянарушая его общий договор. Надеюсь, что один из вас может поймать проблему.
Исключение
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:899)
at java.util.TimSort.mergeAt(TimSort.java:516)
at java.util.TimSort.mergeCollapse(TimSort.java:439)
at java.util.TimSort.sort(TimSort.java:245)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1462)
at java.util.Collections.sort(Collections.java:175)
Метод сравнения
@Override
public int compare(ProductByNameId o1, ProductByNameId o2) {
if (null != o1 && null != o2
&& CollectionUtils.isNotEmpty(o1.getRetails())
&& CollectionUtils.isNotEmpty(o2.getRetails())) {
if (1 < o1.getRetails().size()
&& 1 < o2.getRetails().size()) {
return sortMultiRetailName(o1, o2);
} else {
return sortNonMultiRetailName(o1, o2);
}
} else {
return 0;
}
}
private int sortMultiRetailName(ProductByNameId o1, ProductByNameId o2) {
int compare = sortByNPA(o1, o2);
if (0 == compare) {
return Integer.compare(o2.getRetails().size(), o1.getRetails().size());
}
return compare;
}
private int sortNonMultiRetailName(ProductByNameId o1, ProductByNameId o2) {
int compare = Integer.compare(o2.getRetails().size(), o1.getRetails().size());
if (0 == compare) {
compare = sortByNPA(o1, o2);
if (0 == compare
&& CollectionUtils.isNotEmpty(o1.getExternalReferences())
&& CollectionUtils.isNotEmpty(o2.getExternalReferences())) {
return compareByRetailName(o1, o2);
}
return compare;
}
else
{
return compare;
}
}
private int sortByNPA(ProductByNameId o1, ProductByNameId o2) {
if (StringUtils.isNotBlank(o2.getNpa())
&& StringUtils.isNotBlank(o1.getNpa())) {
return o1.getNpa().compareToIgnoreCase(o2.getNpa());
} else {
return 0;
}
}
private int compareByRetailName(ProductByNameId o1, ProductByNameId o2)
{
if (o2.getRetails().size() == 1 &&
o1.getRetails().size() == 1
&& StringUtils.isNotEmpty(o1.getExternalReferences().get(0).getRetailName())
&& StringUtils.isNotEmpty(o2.getExternalReferences().get(0).getRetailName())) {
return o1.getExternalReferences().get(0).getRetailName()
.compareToIgnoreCase(o2.getExternalReferences().get(0).getRetailName());
}
return 0;
}