Сортировка таблицы с использованием Comparator, который «закрепляет» элементы сверху - PullRequest
0 голосов
/ 06 марта 2019

У меня есть пользовательская таблица, использующая Comparator для сортировки элементов по столбцам.Я хочу "закрепить" некоторые элементы сверху независимо от текущей сортировки (asc / desc).Помимо «обычных» предметов ( C ), которые сравниваются как обычно, у меня также есть один особый предмет ( A ), который всегда должен быть в верхней частитаблица и N «любимых» предметов ( B ), которые должны быть после A и до C иих порядок не важен (но я также попытался «отсортировать» их по числовому значению).

Вот представление о том, как должна выглядеть моя таблица, независимо от того, какая сортировка используется в текущий момент (только C элементы должны быть отсортированы):

A (always present on top)
B (isFavorite)
B (isFavorite)
C (these items are sorted normally)
C
...
C

Вот мой компаратор, который не работает должным образом.Иногда A после B или я даже получаю Comparator violates general contract исключение.

private class CustomOrderAwareComparator implements Comparator<MyObject> {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        // isA() is always true only for one item
        if(o1.isA() && o2.isA())
            return 0;
        else if(o1.isA())
            return table.getSortedOrder() == DESCENDING ? 1 : -1;

        // isB() can be true for multiple items
        if(o1.isB() && o2.isB()))
            return 0;
        else if(o1.isB())
            return table.getSortedOrder() == DESCENDING ? 1 : -1;

        return o1.getValue().compareTo(o2.getValue());
    }
}

Буду признателен за любую информацию о том, что мне здесь не хватает.Спасибо!

1 Ответ

1 голос
/ 06 марта 2019

Я думаю, что после else if (o1.isA()) return... вам также нужно else if (o2.isA()) return table.getSortedOrder() == DESCENDING ? -1 : 1;.Сделайте то же самое для B.В противном случае некоторые из As и некоторые из B могут перейти к проверке getValue().

Это может исправить общее нарушение договора, но вам может потребоваться обновить метод equals, чтобы он соответствовал поведениюcompare.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...