有人可以用简单的语言解释我,为什么这个代码会抛出异常,"比较方法违反了它的一般合同!",我该如何修复它?
private int compareParents(Foo s1, Foo s2) {
if (s1.getParent() == s2) return -1;
if (s2.getParent() == s1) return 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 许多 C++ 标准算法,例如std::sort()
,假设比较器comp
是严格的弱排序,并且不能假设它comp
具有任何其他(好的)属性。但很多时候comp
确实有更多的属性,而不仅仅是严格的弱排序。特别是, many timescomp
是严格的全序(因此,特别是,对于所有a
和b
: comp(a, b)
、comp(b, a)
、 或,以下条件之一始终为真a = b
)。例如,通常operator<()
的浮点数、整数和std::string
s 都是严格的全序。
通过将自身限制为仅假设这comp
是一个严格的弱排序,C++ 标准库是否将自身限制为使用非最佳算法?换句话说,如果 C++ 标准算法假设比较器是严格的总排序而不是严格的弱排序,那么某些标准算法会比当前实现的算法更快吗?
更新:更确切的什么“严总序”的意思,让我们假设STL假设comp
(对类型的对象操作T
)把所有的美好秩序论的属性,这些属性operator<()
在int
S有。(因此,如果您愿意,我们还可以假设operator==()
在类型对象上也有一个T
按您预期工作的定义;这个假设是可选的,如果您愿意,您可以做出不同的假设。)任何 STL 算法都可以吗?做得更快?
更一般地说,如果 STL 做出了“更好”的假设comp
(即假设comp
不仅仅是严格的弱排序),那么任何 STL 算法都可以做得更快吗?
作为实习的一部分,我被要求调查一个错误.一段代码正在抛出
java.lang.IllegalArgumentException:比较方法违反了它的一般合同!
自定义Comparator
是通过查看long
所述自定义类的成员变量来比较两个自定义类:
return v1 > v2 ? -1 : v1 < v2 ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)
equals
此自定义类的方法查看此自定义类的String
成员变量.我们有一段时间重现这种行为.我下意识的反应是代替return语句在自定义Comparator
与return v2.compareTo(v1);
范围,但我们是持怀疑态度,这将解决这个问题.有人可以提供任何见解吗?
Arrays.sort(anArray, new Comparator<ACustomClass>() {
@Override
public int compare(ACustomClass o1, ACustomClass o2) {
long v1 = o1.getALong();
long v2 = o2.getALong();
return v1 > v2 ? -1 : v1 < v2 ? 1 : 0;
}});
Run Code Online (Sandbox Code Playgroud)