2016-01-05 21 views
5

Il codice seguente è in Classe String in java. Non capisco perché i caratteri di due stringhe diverse vengano confrontati con lo due volte. in un primo momento facendo il maiuscolo e se ciò fallisce facendo minuscole.Perché lo stesso carattere è comparato due volte cambiando il suo caso in MAIUSCOLO e poi in basso?

La mia domanda qui è, è necessario? Se sì, perché?

public static final Comparator<String> CASE_INSENSITIVE_ORDER 
              = new CaseInsensitiveComparator(); 
     private static class CaseInsensitiveComparator 
       implements Comparator<String>, java.io.Serializable { 
      // use serialVersionUID from JDK 1.2.2 for interoperability 
      private static final long serialVersionUID = 8575799808933029326L; 

      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; 
      } 
     } 

risposta

12

Il problema potrebbe essere più complesso.

Ci sono caratteri, dove ci sono multipli codici minuscoli per lo stesso codice maiuscolo o viceversa. Quindi per verificare la corrispondenza senza distinzione tra maiuscole e minuscole, è necessario per confrontare entrambe le versioni maiuscole e minuscole se una di esse corrisponde a corrispondenze.

Un esempio è

Il greco lettera maiuscola "Σ" ha due diverse forme minuscole: "ς" in posizione finale di parola e "σ" altrove.

Fonte: Wikipedia

Per maiuscolo non uguale ma minuscola molto così, VGR fornito questo ottimo esempio:

Un esempio migliore sarebbe '\ u0130' (I) e ' IO'. Passandoli attraverso toUpperCase li lascia invariati (e quindi diversi), ma passandoli attraverso a LowerCase si ottengono valori di caratteri identici

+0

Puoi fare un esempio? Stringhe e caratteri non si occupano di Charsets; I set di caratteri sono usati solo per codificarli come byte. –

+0

Da Wikipedia: "La lettera maiuscola greca" Σ "ha due diverse forme minuscole:" ς "nella posizione parola-finale e" σ "altrove." Https://en.wikipedia.org/wiki/Letter_case – Jan

+0

ma che cosa ha a che fare con Charsets? –