2 回答

TA贡献1803条经验 获得超6个赞
将@RealSkeptic 的评论作为答案:
的java-docsComparable
说:
该接口对实现它的每个类的对象进行了总排序。
全排序应遵循以下属性:
反身性
反对称
传递性
可比性
要了解更多关于完全有序集合的信息,请参见此链接。
我的排序策略不是传递的。
假设我的初始列表是[(d,2), (y,1), (b,1)]
(y,1) < (b,1)
至于相同的索引,我不想打乱顺序。(b,1) < (d,2)
至于不同的索引,我可以打乱顺序,然后我只需要比较字符。
通过传递性,(y,1) < (d, 2)
. 这不是真的。
所以这不是一个完全有序的比较。因此它打破了Comparable
接口提供的规则。
所以我们不能对这个排序策略有一个正确的实现compareTo
(遵守Comparable
接口的约定)。
你学到了什么?
您的排序策略应始终定义实现的类对象的总排序Comparable

TA贡献1802条经验 获得超6个赞
这是因为你有o1.compareTo(o2) == -1 && o2.compareTo(o1) == -1if o1.index == o2.index。方法的约定compareTo是这两个必须是不同的符号:o1.compareTo(o2)和o2.compareTo(o1)。
换句话说,这意味着o1小于o2和o2小于o1,这是不可能的。
可能的解决方案:
@Override
public int compareTo(CharacterIndex ci) {
return Character.compare(this.c, ci.c);
}
在这里,我们按其携带的字符进行比较。正如@RealSkeptic 注意到的那样,由于关系不再具有传递性,因此无法考虑索引。
添加回答
举报