2012-06-24 12 views
33

que necesito lista de cadenas ordenar por orden alfabético:Una manera sencilla de ordenar cadenas en el (mayúsculas y minúsculas) orden alfabético

List<String> list = new ArrayList(); 
list.add("development"); 
list.add("Development"); 
list.add("aa"); 
list.add("AA"); 
list.add("Aa"); 

Una forma común de hacerlo es utilizar comparador:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER); 

El problema del CaseInsensitiveComparator es que "AA" es igual a "aa". Cadenas aparecen en el resultado de acuerdo con el orden de adición de los mismos valores, y no es correcta:

"aa","AA","Aa","development","Development" 
+3

Cuando escribe que tratar "AA" y "aa" lo mismo "no es correcto", ¿cuál es su definición exacta de "orden alfabético"? Su respuesta ed emitida pero aún no [aceptada] (http://meta.stackexchange.com/q/5234/188688) sugiere que desea romper vínculos utilizando la comparación de mayúsculas y minúsculas "normal". Para darle una idea de cuán compleja es la "clasificación alfabética" en el mundo de Unicode y con diferentes configuraciones regionales, eche un vistazo a lo que escribe la [ICU] (http://site.icu-project.org/) Guía del usuario sobre [ colación] (http://userguide.icu-project.org/collation). – MvG

Respuesta

56

Si no desea agregar una dependencia de la guayaba (por la respuesta de Michael), entonces este comparador es equivalente:

private static Comparator<String> ALPHABETICAL_ORDER = new Comparator<String>() { 
    public int compare(String str1, String str2) { 
     int res = String.CASE_INSENSITIVE_ORDER.compare(str1, str2); 
     if (res == 0) { 
      res = str1.compareTo(str2); 
     } 
     return res; 
    } 
}; 

Collections.sort(list, ALPHABETICAL_ORDER); 

y creo que es tan fácil de entender y de código ...

los últimos 4 líneas del método puede escrito de manera más concisa de la siguiente manera:

 return (res != 0) ? res : str1.compareTo(str2); 
+1

Convertiría eso en un operador ternario :) Eliminaría la reasignación y haría código aún más corto. –

+5

@MarkoTopolnik - Normalmente también lo haría ... pero intentaba hacer que el código fuera lo más fácil de entender posible. –

+0

De acuerdo, de esta manera es más obvio para el lector general. –

13

La forma más simple de resolver el problema es utilizar ComparisonChain de guayaba http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ComparisonChain.html

private static Comparator<String> stringAlphabeticalComparator = new Comparator<String>() { 
     public int compare(String str1, String str2) { 
      return ComparisonChain.start(). 
           compare(str1,str2, String.CASE_INSENSITIVE_ORDER). 
           compare(str1,str2). 
           result(); 
     } 
}; 
Collections.sort(list, stringAlphabeticalComparator); 

El primer comparador de la cadena clasificará cadenas de acuerdo con el orden insensible a mayúsculas y minúsculas, y el segundo comparador clasificará cadenas de acuerdo con el orden insensible a mayúsculas y minúsculas. cuerdas Como exceptuadas aparecen en el resultado de acuerdo con el orden alfabético:

"AA","Aa","aa","Development","development" 
1

Recientemente he respondido una pregunta similar here. Aplicando el mismo enfoque a su problema cedería siguiente solución:

list.sort(
    p2Ord(stringOrd, stringOrd).comap(new F<String, P2<String, String>>() { 
    public P2<String, String> f(String s) { 
     return p(s.toLowerCase(), s); 
    } 
    }) 
); 
+0

El problema es que "AA" es igual a "aa". Las cadenas aparecen en el resultado según el orden de sumar para los mismos valores, y no es correcto: "aa", "AA", "Aa", "desarrollo", "Desarrollo" Debe usar una comparación adicional para distinguir "AA" y "aa". – Michael

+0

Aquí está la salida de mi código anterior: '[AA, Aa, aa, Desarrollo, desarrollo]'.Coincide con lo que se espera? – missingfaktor

+0

@Michael, consulte la respuesta vinculada para comprender cómo funciona esto. – missingfaktor

0

Utilice simplemente

java.util.Collections.sort(list) 

sin parámetro comparador String.CASE_INSENSITIVE_ORDER.

-1
import java.util.Arrays; 
import java.util.Scanner; 

public class Test3 { 
    public static void main(String[] args) { 

     String a; 
     String b; 
     try (Scanner scan = new Scanner(System.in)) { 
      a = scan.next(); 
      b = scan.next(); 
     } 
     boolean ret = isAnagram(a, b); 
     System.out.println((ret) ? "Anagrams" : "Not Anagrams"); 

    } 

    static boolean isAnagram(String a, String b) { 
     int l1 = a.length(); 
     int l2 = b.length(); 
     boolean rat = false; 

     if (l1 <= 50) { 
      if (l1 == l2) { 

       char[] chars1 = a.toLowerCase().toCharArray(); 
       char[] chars2 = b.toLowerCase().toCharArray(); 
       Arrays.sort(chars1); 
       Arrays.sort(chars2); 
       String Ns1 = new String(chars1); 
       String Ns2 = new String(chars2); 
       if (Ns1.equals(Ns2)) { 
        rat = true; 
       } 
      } 
     } 
     return rat; 
    } 
} 
Cuestiones relacionadas