2015-07-29 5 views
18

'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?

+0

Özellikle bu sorunun cevabı (http://stackoverflow.com/a/25513639/2336725). – Teepeemm

cevap

25

Küçük harf olarak farklı olan, ancak aynı büyük harf formuna sahip Unicode karakterleri vardır. Örneğin Yunan harfli Sigma - iki küçük harf formuna sahiptir (sadece kelimenin sonunda kullanılan σ ve ς), ancak sadece bir büyük harf biçimidir (Σ).

Geriye hiçbir örnek bulamadım, ancak gelecekte böyle bir durum yaşanırsa, mevcut Java uygulaması zaten bunun için hazırlanmıştır. Comparator versiyonunuz, Sigma kasasını doğru bir şekilde kullanacaktır.

Daha fazla bilgiyiUnicode web sitesinde bulabilirsiniz.

+0

Ortak Alman karakteri “ß” sadece küçük harf formunda bulunur ve büyük harfle SS olur. – maja

+0

@maja "SS" iki karakterdir. Bu dönüştürme, yalnızca dizilerde değil, tek karakterde gerçekleştirilir. – xehpuk

+3

Aslında, 2008'de Evrensel Karakter Seti'ne ß (ẞ) büyük harf eklendi: https://wikipedia.org/wiki/Capital_ẞ Ancak, resmi hükümet belgelerinde coğrafi yerlerin adları için zorunlu olmasına rağmen, 2010 yılında vahşi doğada bir tane görülmedi. –