Пользовательский компаратор неправильно сортирует - PullRequest
0 голосов
/ 21 мая 2018

Я создал собственный компаратор для своего пользовательского объекта.

Я хочу отсортировать свои товары в соответствии с этими правилами:

  1. 1-й элемент в моем упорядоченном списке должен бытьисходный элемент списка с ID == null (я уверен, что для сортировки каждого списка есть только один или ни одного)
  2. 2-й элемент в моем упорядоченном списке должен быть исходным элементом списка с ID == emptyUUID(пустой UUID, поэтому все 0; я также уверен, что для каждого списка, который нужно отсортировать, есть только один или ни одного)
  3. остальные элементы будут заполнять список, отсортированный по CODE

Вот что я пробовал:

@Override
public int compareTo(Component f) {
    if (getID() == null) {
        return -1;
    }
    if (getID().equals(RuntimeHelper.emptyUUIDString)) {
        return -1;
    }
    if (getCODE() == null || getCODE().isEmpty()) {
        return -1;
    } else if (f.getCODE() == null || f.getCODE().isEmpty()) {
        return 1;
    }
    return getCODE().compareToIgnoreCase(f.getCODE());
}

Но я получаю:

  • 1-й -> список некоторых объектов, отсортированных по CODE
  • 2-й -> в середине списка мой объект с ID == null / emptyUUID
  • 3-й -> другие элементы сортировки по CODE

Чтоя пропускаю?

Решение, благодаря Генри и Стивену

Я знаю, что это все еще сырой, но это работает, скоро это будет выглядеть немного лучше

@Override
public int compareTo(Component f) {
    if (f.getID() == null && getID() == null) {
        return 0;
    }
    if (getID() == null) {
        return -1;
    }
    if (f.getID() == null) {
        return 1;
    }
    if (f.getID().equals(getID())) {
        return 0;
    }
    if (getID().equals(RuntimeHelper.emptyUUIDString)) {
        return -1;
    }
    if (f.getID().equals(RuntimeHelper.emptyUUIDString)) {
        return 1;
    }
    if (getCODE() == null || getCODE().isEmpty()) {
        return -1;
    }
    if (f.getCODE() == null || f.getCODE().isEmpty()) {
        return 1;
    }
    return getCODE().compareToIgnoreCase(f.getCODE());
}

1 Ответ

0 голосов
/ 21 мая 2018

Вот некоторые проблемы:

if (getID() == null) {
    return -1;
}

Вышеупомянутое нарушает договор, если f.getID() также null.Кроме того, если f.getID() равно null и this.getUID() НЕ null, то вам следует вернуть +1 в этой точке

if (getID().equals(RuntimeHelper.emptyUUIDString)) {
    return -1;
}

Подобные недостатки в предыдущем случае.

if (getCODE() == null || getCODE().isEmpty()) {
    return -1;
} else if (f.getCODE() == null || f.getCODE().isEmpty()) {
    return 1;
}

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


Выше по-разному нарушают один или оба из этих инвариантов:

  • compare(a, a) == 0 для всех a != null
  • compare(a, b) == -1 <=> compare(b, a) == +1 для всех a != null и b != null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...