为什么这两个代码段会产生相同的结果?

时间:2016-07-12 08:53:57

标签: java arrays comparator

我正在查看一堆类似的代码并使用Comparator<T>对一系列字符串进行排序(我问这个问题的唯一原因是我对如何对此感到好奇Comparator<T>处理所有这些):

 String[] names = //An string array

 Arrays.sort(names, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return (o1.length()-o2.length());
        }
    });

我对此很熟悉:

Arrays.sort(names, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            if(o1.length()>o2.length())
                return 1;
            else if(o1.length()==o2.length())
                return 0;
            else
                return -1;
        }
    });

如果第一个String的长度更大则返回1,如果第二个String更大则返回-1,如果长度相同则返回零。但是第一个片段返回了它们的长度之间的差异,它可能小于-1且大于1.那么Comparator<T>如何处理它们产生相同结果的所有这些?

4 个答案:

答案 0 :(得分:6)

来自https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html#compare(T,%20T)

  

返回:负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数。

它不需要是-1或1,而只需要一个负整数或一个正整数。

答案 1 :(得分:3)

不确定这是否是您的意思,但Comparator结果是定性,而不是定量。

任何超过0的结果意味着第一个参数被认为大于第二个参数,任何小于0的结果意味着第一个参数被认为是更少(和0,而0仅表示它们被认为是等价的)

第一个实现返回距离,是的,但就Comparable而言,这是无关的信息。顺便说一句,第一个实现真的应该使用Integer.compare()

答案 2 :(得分:1)

检查Comparator compare方法的Javadoc:

  

返回:负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数。

只返回整数的符号,而不是其绝对值。

答案 3 :(得分:0)

比较器只是查看结果的符号,因此它可以是:

  • 0:两个元素相同
  • positive:o1更大
  • negative:o2更大