我写了自定义比较器:
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?
为什么会这样?
答案 0 :(得分:4)
1
表示第一个参数更大比第二个参数更高,因为默认顺序是增加然后是从 e 开始将是最后一个,所以你需要的是交换-1
,1
:
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)