Вложенное исключение - java.lang.IllegalArgumentException: метод сравнения нарушает его общий контракт. - PullRequest
0 голосов
/ 07 октября 2019

Я знаю, что об этом спрашивали много раз, но я получаю эту ошибку после выполнения операции поиска в среде, где невозможна отладка.

Я пытаюсь понять, почему мой метод сравнениянарушая его общий договор. Надеюсь, что один из вас может поймать проблему.

Исключение

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...