对CaseInsensitiveComparator的实现感到好奇
当我检查CaseInsensitiveComparator
的实现时,它是String
私有内部类,我发现了奇怪的事情。
private static class CaseInsensitiveComparator implements Comparator, java.io.Serializable { ... public int compare(String s1, String s2) { int n1 = s1.length(); int n2 = s2.length(); int min = Math.min(n1, n2); for (int i = 0; i < min; i++) { char c1 = s1.charAt(i); char c2 = s2.charAt(i); if (c1 != c2) { c1 = Character.toUpperCase(c1); c2 = Character.toUpperCase(c2); if (c1 != c2) { c1 = Character.toLowerCase(c1); c2 = Character.toLowerCase(c2); if (c1 != c2) { // No overflow because of numeric promotion return c1 - c2; } } } } return n1 - n2; } ... }
我很好奇的是:在for
循环中,一旦你比较上面的套管字符,为什么你应该再次比较下套管字符? 当Character.toUpperCase(c1)
和Character.toUpperCase(c2)
不同时, Character.toLowerCase(c1)
和Character.toLowerCase(c2)
是否可能相等?
难道不能像这样简化吗?
public int compare(String s1, String s2) { int n1 = s1.length(); int n2 = s2.length(); int min = Math.min(n1, n2); for (int i = 0; i < min; i++) { char c1 = s1.charAt(i); char c2 = s2.charAt(i); if (c1 != c2) { c1 = Character.toUpperCase(c1); c2 = Character.toUpperCase(c2); if (c1 != c2) { // No overflow because of numeric promotion return c1 - c2; } } } return n1 - n2; }
我错过了什么?
Unicode字符的大小写不同,但大写forms相同。 例如希腊字母Sigma – 它有两个小写forms(σ和ς仅用于单词的末尾),但只有一个大写forms(Σ)。
我找不到任何相反的例子,但如果将来发生这种情况,那么当前的Java实现已经为此做好了准备。 您的Comparator
版本肯定会正确处理Sigma案例。
您可以在Unicode网站上的案例映射常见问题解答中找到更多信息。