【发布时间】:2015-07-23 08:57:18
【问题描述】:
看看这段代码
class StringComparator implements Comparator<String> {
@Override
public int compare(String a, String b) {
if (a.length() == b.length()) {
return b.compareTo(a);
} else {
String ab = a + b;
String ba = b + a;
return ba.compareTo(ab);
}
}
}
ba.compareTo(ab) 有效,但 ab.compareTo(ba) 失败。它抛出一个 IllegalArgumentException 引用违反比较器合同。我相信这是由于传递性属性不满足。有人可以解释一下 Java 如何在 Strings 的情况下使用传递性属性吗?这与 Timsort 的工作原理有什么关系吗?
编辑:这是我在 Leetcode 在线法官上遇到的错误
Runtime Error Message:
Line 32: java.lang.IllegalArgumentException: Comparison method violates its general contract!
Last executed input:
[7286,155,351,6059,9686,2668,9551,5410,7182,170,3746,3095,8139,2587,2351,2341,2038,3956,6034,4071,9473,281,9306,8746,7954,8937,7855,3938,9737,2455,4344,2986,8968,1072,2442,7191,9106,4236,2768,5214,7541,329,7530,9068,9644,3539,5177,5332,2065,8245,7494,8454,604,4632,1745,301,3412,1569,8637,7840,7752,9536,1023,4841,1286,6489,8459,2725,8021,5026,7058,4540,9892,5344,1205,4363,959,9729,9225,9733,8417,9873,3721,1434,5136,6111,6189,780,4741,2670,2457,5424,1040,3746,1229,8568,3636,1546,2553,575]
再次,当我使用 ba.compareTo(ab) 时,我没有收到此错误。我
【问题讨论】:
-
ab.compareTo(ba)实际上是如何失败的?你的意见是什么? -
我正在尝试将 int 转换为字符串后进行比较。我正在尝试解决leetcode.com/problems/largest-number
-
为什么不比较整数,然后使用字符串作为累加器来构建结果? (比较整数,将较大的附加到字符串/字符串生成器)
-
好主意。虽然我仍然很好奇为什么 "93".compareTo("39") 有效但 "39".compareTo("93") 无效?
-
System.out.println("39".compareTo("93"))打印出-6。无效是什么意思?
标签: java string comparator compareto timsort