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"
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);
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"
Simplement utiliser
Java.util.Collections.sort(list)
sans paramètre de comparateur String.CASE_INSENSITIVE_ORDER.
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);
}
})
);