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>
使用上述给定的策略进行排序?