繁体   English   中英

自定义 CompareTo(),为什么 compareTo 的顺序对排序顺序很重要?

[英]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 < bb < 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM