相关疑难解决方法(0)

"比较方法违反了其总合同!"

有人可以用简单的语言解释我,为什么这个代码会抛出异常,"比较方法违反了它的一般合同!",我该如何修复它?

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)

java comparator

179
推荐指数
6
解决办法
18万
查看次数

如果比较器需要严格的总排序而不是严格的弱排序,C++ 标准算法会更快吗?

许多 C++ 标准算法,例如std::sort(),假设比较器comp严格的弱排序,并且不能假设它comp具有任何其他(好的)属性。但很多时候comp确实有更多的属性,而不仅仅是严格的弱排序。特别是, many timescomp严格的全序(因此,特别是,对于所有ab: comp(a, b)comp(b, a)、 或,以下条件之一始终为真a = b)。例如,通常operator<()的浮点数、整数和std::strings 都是严格的全序。

通过将自身限制为假设这comp是一个严格的弱排序,C++ 标准库是否将自身限制为使用非最佳算法?换句话说,如果 C++ 标准算法假设比较器是严格的总排序而不是严格的弱排序,那么某些标准算法会比当前实现的算法更快吗?

更新:更确切的什么“严总序”的意思,让我们假设STL假设comp(对类型的对象操作T)把所有的美好秩序论的属性,这些属性operator<()intS有。(因此,如果您愿意,我们还可以假设operator==()在类型对象上也有一个T按您预期工作的定义;这个假设是可选的,如果您愿意,您可以做出不同的假设。)任何 STL 算法都可以吗?做得更快?

更一般地说,如果 STL 做出了“更好”的假设comp(即假设comp不仅仅是严格的弱排序),那么任何 STL 算法都可以做得更快吗?

c++ algorithm std comparator

6
推荐指数
1
解决办法
202
查看次数

另一种"比较方法违反了其总合同!"

作为实习的一部分,我被要求调查一个错误.一段代码正在抛出

java.lang.IllegalArgumentException:比较方法违反了它的一般合同!

自定义Comparator是通过查看long所述自定义类的成员变量来比较两个自定义类:

return v1 > v2 ? -1 : v1 < v2 ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

equals此自定义类的方法查看此自定义类的String成员变量.我们有一段时间重现这种行为.我下意识的反应是代替return语句在自定义Comparatorreturn 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)

java comparator illegalargumentexception java-7

1
推荐指数
1
解决办法
660
查看次数