private static class CharacterIndex implements Comparable<CharacterIndex> {
private final char c;
private final int index;
public CharacterIndex(char c, int index) {
this.c = c;
this.index = index;
}
}
Теперь я хочу переопределить метод compareTo
для этого класса так, чтобы, если у меня были следующие List
из CharacterIndex
объектов [('y', 1), ('x', 2), ('b', 3), ('a', 3)]
, тогда после сортировки объекты должны быть похожи на [('b', 3), ('a', 3), ('x', 2), ('y', 1)]
.
Стратегия сортировки:
Объекты, для которых индекс отличается, могут быть перетасованы (и должны быть в отсортированном порядке, основываясь только на значении символа).Объекты с одинаковым индексом должны сохранять свой относительный порядок после сортировки.
Еще один пример:
Для [('y', 1), ('w', 2), ('x', 3)]
отсортированный список должен быть [(w, 2), (x, 3), (y, 1)]
, а не [(x, 3), (w, 2), (y, 1)]
.
Моя попытка:
@Override
public int compareTo(CharacterIndex ci) {
if (this.index == ci.index)
return -1; // don't swap if the index is same
return Character.compare(this.c, ci.c);
}
Но этот подход дает мне исключение:
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:866)
at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:483)
at java.util.ComparableTimSort.mergeForceCollapse(ComparableTimSort.java:422)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:222)
at java.util.Arrays.sort(Arrays.java:1312)
at java.util.Arrays.sort(Arrays.java:1506)
at java.util.ArrayList.sort(ArrayList.java:1462)
at java.util.Collections.sort(Collections.java:141)
Я видел это .Но я не мог четко понять, почему я получаю это исключение.
Есть ли лучший способ отсортировать List<CharacterIndex>
с помощью приведенной выше стратегии?