为什么比较是这样的?

时间:2017-08-27 17:31:03

标签: java

我写了自定义比较器:

     public static Comparator<String> compareEThenEverything(){
            return (s1, s2) -> {
                if(s1.toLowerCase().startsWith("e") && s2.toLowerCase().startsWith("e")) 
                return 0;
                if(s1.toLowerCase().startsWith("e")) return 1;
                return -1;
            };
        }

我想对我的数组进行排序,所有字符串都以&#39; e&#39;开头。将是第一个。

为什么当前比较器工作正常?好像这个词用&#34; e&#34;第一个字符比其他字符大于字,因为我返回1 - 不是-1?

为什么会这样?

2 个答案:

答案 0 :(得分:4)

1表示第一个参数更大第二个参数更高,因为默认顺序是增加然后是从 e 开始将是最后一个,所以你需要的是交换-11

public static Comparator<String> compareEThenEverything(){
    return (s1, s2) -> {
        if(s1.toLowerCase().startsWith("e"))
            return -1;
        if(s1.toLowerCase().startsWith("e") && s2.toLowerCase().startsWith("e"))
            return 0;
        return 1;
    };
}

答案 1 :(得分:0)

正如其他人已经指出的那样,你看到它已经逆转了#34;因为Comparator contract的工作方式相反:

  

比较其订单的两个参数。返回负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数。

我强烈建议您在继续之前阅读Comparator javadoc

这个比较器将制作以&#39; e&#39;总是先出现。

private static final Comparator<String> E_FIRST = (s1, s2) -> {
    char s1c = s1.isEmpty() ? (char) Character.UNASSIGNED : Character.toLowerCase(s1.charAt(0));
    char s2c = s2.isEmpty() ? (char) Character.UNASSIGNED : Character.toLowerCase(s2.charAt(0));
    return s1c == 'e' ? (s1c == s2c ? 0 : -1) : s2c == 'e' ? 1 : 0;
};

此外,此实现仅检查第一个字符,而不是将整个字符串转换为小写。

如果您还希望对其他字符串进行排序,可以使用String. CASE_INSENSITIVE_ORDER链接它:

E_FIRST.thenComparing(String.CASE_INSENSITIVE_ORDER)