web-dev-qa-db-fra.com

Un moyen simple de trier les chaînes dans l'ordre alphabétique (sensible à la casse)

Je dois trier la liste des chaînes dans l'ordre alphabétique:

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

Une façon courante de le faire est d'utiliser un comparateur:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

Le problème de CaseInsensitiveComparator est que "AA" est égal à "aa". Les chaînes apparaissent dans le résultat en fonction de l'ordre d'ajout pour les mêmes valeurs, et ce n'est pas correct:

"aa","AA","Aa","development","Development"
40
Michael

Si vous ne voulez pas ajouter de dépendance à Guava (selon la réponse de Michael), alors ce comparateur est équivalent:

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

Et je pense que c'est tout aussi facile à comprendre et à coder ...

Les 4 dernières lignes de la méthode peuvent être écrites de manière plus concise comme suit:

        return (res != 0) ? res : str1.compareTo(str2);
68
Stephen C

Le moyen simple de résoudre le problème consiste à utiliser ComparisonChain de Guava 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);

Le premier comparateur de la chaîne triera les chaînes en fonction de l'ordre insensible à la casse, et le deuxième comparateur en triera les chaînes en fonction de l'ordre insensible à la casse. Comme des chaînes exceptées apparaissent dans le résultat selon l'ordre alphabétique:

"AA","Aa","aa","Development","development"
16
Michael

Simplement utiliser

Java.util.Collections.sort(list)

sans paramètre de comparateur String.CASE_INSENSITIVE_ORDER.

1
L. G.

J'ai récemment répondu à une question similaire ici . En appliquant la même approche à votre problème, vous obtiendrez la solution suivante:

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