[英]Self Define CompareTo(), why does the order of compareTo matters to the sorting order?
我有 [3,30,34,5,9] 要排序的字符串数组,
但是,对于值 3 和 30,3 必须大于 30
使得字符串 a+b > b+c。 如果 a = 3 且 b = 30; ab>ba => 330>303 所以 3 应该大于 30;
这样我的数组 [3,30,34,5,9] 排序后应该是 [9,5,34,3,30]
我发现了一个实现比较器的 class function 如下:
private class LargerNumberComparator implements Comparator<String> {
@Override
public int compare(String a, String b) {
String order1 = a + b;
String order2 = b + a;
return order1.compareTo(order2);
}
}
在上面的代码中,它将按升序对我的字符串进行排序,使得原始数组:[3,30,34,5,9] 将变为 [30,3,34,5,9]
但是,如果我更改 return order1.compareTo(order2); 将返回 order2.compareTo(order1) 将数组的排序顺序从升序更改为降序;
问:为什么 order to.compareTo 会改变排序顺序?
compare(a, b)
返回一个数字,如果a < b
则返回负数,如果a == b
则返回零,如果a > b
则返回正数。
假设compare(a, b)
返回一个负数,所以a < b
。
然后order1.compareTo(order2)
也返回了一个负数,所以order1 < order2
。
但是,如果您返回order2.compareTo(order1)
,那么我们知道order1 < order2
。 但这意味着order2 > order1
,所以order2.compareTo(order1)
将返回一个正数。
一般来说,实际上只是a < b
与b < a
不是一回事——恰恰相反。
Comparator.compare()
的文档说:
比较其两个 arguments 的订单。 返回负 integer、零或正 integer,因为第一个参数小于、等于或大于第二个。
您可以在文档中看到订单很重要。 第一个参数和第二个参数是不同的。 所以如果你比较两个字符串
"a".compareTo( "b" ) // returns negative
结果表明a
应该小于b
。 但是,如果您以这种方式比较字符串:
"b".compareTo( "a" ) // returns positive
结果表明a
实际上大于b
,因此您将a
放在b
之后。 换句话说,反向排序顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.