【问题标题】:CompareTo in Comparators比较器中的 CompareTo
【发布时间】:2020-03-26 02:11:44
【问题描述】:

我有一个关于 compareTo 函数如何协助比较器进行排序的问题 即 o1.compareTo(o2) 与 o2.compareTo(o1)

如果两个字符串相等,则此方法返回 0,否则返回正值或负值。如果第一个字符串在字典顺序上大于第二个字符串,则结果为正,否则结果为负。

上面的语句很简单,但是 o1.compareTo(o2) 怎么会给我一个升序,而 o2.compareTo(o1) 给我一个降序呢?

如果我有整数值 '5,10,3',我会得到 3,5,10 和 o1.compareTo(o2),而后者则相反

String str1 = "Negan";  
String str2 = ""; //empty string

//it would return the length of str1 in positive number
str1.compareTo(str2); // 5

//it would return the length of str1 in negative number
str2.compareTo(str1); //-5

按照这个逻辑,使用上面的代码,对于 str1.compareTo(str2),我应该有一个升序,其中按字母顺序排列更大的数字在后面,但是如果 str1 以“”出现而 str2 是“Negan”会发生什么。当将 1 与 2 进行比较时,是否设置了某种规则 -> 意味着如果值为负,则将其放在开头,如果为正,则将其放在结尾?或者,如果 compareTo 是 str2.compareTo(str1),如果值为负,则将其置于末尾,如果为正,则将其置于开头,同时考虑参数 (str1,str2) 与(str2, str1) 其中各个 compareTo 订单将执行相同的操作,只是 str1.compareTo(str2) = str2.compareTo(str1)。

编辑:简单地说,如果参数是可互换的并且以二进制形式将执行相同的操作,则返回的值如何确定定位。

【问题讨论】:

    标签: java comparator compareto


    【解决方案1】:

    如果a < ba.compareTo(b) 小于零,您可以将其解读为“a 在 b 之前”。如果a > b,则a.compareTo(b) 大于零,即“a 在 b 之后”。

    也就是说,在其中一个对象上调用 compareTo,另一个对象作为参数。它的作用是报告“this”对象是否小于/等于/大于“argument”对象。

    注意a.compareTo(b) 等于- b.compareTo(a)

    现在是比较器。 Comparator.compare(a, b) 应该报告 'a' 和 'b' 的顺序,因此必须(对于升序)调用 a.compareTo(b) 而不是 b.compareTo(a) - 因为前者会导致正确的结果为负 if a 在 b 之前,如果 a 在 b 之后,则严格为正。

    因此,如果您编写比较器,使compare(a, b) 调用a.compareTo(b),您将获得升序;如果它调用b.compareTo(a),你会得到降序。

    【讨论】:

    • 我知道这可能不是常识,但是 Java 是如何被编程来确定要遵循哪个规则的呢?是通过参数函数的排序,然后根据哪个类型调用 compareTo 函数?
    • 编辑了我的答案;这有帮助吗?
    • 比较功能!我完全忘记了这一点。非常感谢!我在想你什么时候使用 lambda 表达式,而在其中我没有明确使用比较函数并忘记了它。不管它作为一个,因此如果a在b之前,你将有一个升序。
    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多