【问题标题】:How does the Comparator works with Arrays.sort?Comparator 如何与 Arrays.sort 一起使用?
【发布时间】:2018-07-04 08:05:03
【问题描述】:

我的问题是比较器接口如何与 arrays.sort 方法一起使用? 例如:

  Arrays.sort(arr, new Comparator<String>(){
        public int compare(String first, String second){
            System.out.println("Comparator : (second+first)  "+(second+first)+" first+ second "+(first+second)+" comparing : "+(second+first).compareTo(first+second));
            return (second+first).compareTo(first+second);
        }
    });

输入

arr = {"34","4","23","15"}

所以上面的sn-p基本上就是把数组排列成最大的数。

输出将是{"4","34","23","15"}

我打印了中间结果,输出符合预期,但我无法理解它是如何工作的。有人可以说它是如何使用比较方法返回的整数排序的吗?

Comparator : (second+first)  344 first+ second 434 comparing : -1
Comparator : (second+first)  423 first+ second 234 comparing : 2 
Comparator : (second+first)  3423 first+ second 2334 comparing : 1 
Comparator : (second+first)  3415 first+ second 1534 comparing : 2
Comparator : (second+first)  2315 first+ second 1523 comparing : 1

【问题讨论】:

  • 两个字符串在读取方向上进行比较。在第一个不匹配的字符上,返回它们的代码点值之间的差异。如果字符串相等,则返回 0。另见en.wikipedia.org/wiki/…
  • 真正的问题是什么?
  • 我的问题是comapare方法返回正值或负值或零值,数组是如何排序的?
  • @KarthikRaja 可能会阅读下面的答案,我已经解释了 5 条规则;)
  • @azro 谢谢伙计,它帮助了我现在我可以从逻辑上理解它是如何工作的。

标签: java arrays comparator


【解决方案1】:

a.compareTo(b) 的规则

  • returns negative valuea is before b
  • returns 0a equal to b
  • return positive valuea is after b

因为参数是first, second,而你比较像second.compareTo(first),你会得到相反的顺序:

(second+first)   344 first+ second  434 comparing : -1 >>   4 is before 34
(second+first)   423 first+ second  234 comparing : 2  >>  23 is after   4
(second+first)  3423 first+ second 2334 comparing : 1  >>  23 is after  34
(second+first)  3415 first+ second 1534 comparing : 2  >>  15 is after  34
(second+first)  2315 first+ second 1523 comparing : 1  >>  15 is after  23

使用这 5 个before/after 规则,顺序为4 34 23 15

这是Reverse Lexical Order(因为使用了String,所以是词法,因为第二个和第一个比较而反向)


一个案例的详细信息

  • sort 方法将比较434,所以first=4second=34
  • 你计算 "344".compareTo("434"),因为 344 在 434 之前是你得到 -1 的词法顺序
  • 因为-1sort方法会记住434之前

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    相关资源
    最近更新 更多