'un uygulanmasıyla ilgili merak ettiğim, String
özel iç sınıfı olan CaseInsensitiveComparator
'un uygulanışını kontrol ederken garip bir şey buldum.CaseInsensitiveComparator
private static class CaseInsensitiveComparator
implements Comparator<String>, 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;
}
...
}
Ne merak ediyorum şudur: Eğer üst kılıflı karakterleri karşılaştırmak kez for
döngü olarak, neden tekrar alt kasalı karakterleri karşılaştırmak gerekir? Character.toUpperCase(c1)
ve Character.toUpperCase(c2)
farklı olduğunda, Character.toLowerCase(c1)
ve Character.toLowerCase(c2)
'un eşit olması mümkün mü?
Böyle basitleştirilemez mi?
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;
}
Bir şey mi özledim?
Özellikle bu sorunun cevabı (http://stackoverflow.com/a/25513639/2336725). – Teepeemm