Tri des listes par ordre alphabétique (insensible à la casse)

121

J'ai un arraylist de chaîne namesqui contient des noms de personnes. Je veux trier l'arraylist par ordre alphabétique.

ArrayList<String> names = new ArrayList<String>();
names.add("seetha");
names.add("sudhin");
names.add("Swetha");
names.add("Neethu");
names.add("ananya");
names.add("Athira");
names.add("bala");
names.add("Tony");
names.add("Karthika");
names.add("Nithin");
names.add("Vinod");
names.add("jeena");
Collections.sort(names);
for(int i=0; i<names.size(); i++)
    System.out.println(names.get(i));

J'ai essayé de trier la liste de la manière ci-dessus. Mais il affiche le tableau trié comme suit:

Athira
Karthika
..
..
ananya
bala
...

mais je ne veux pas le rendre sensible à la casse. Je veux le résultat comme:

ananya
Athira
bala
andro-fille
la source

Réponses:

330

La coutume Comparatordevrait aider

Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareToIgnoreCase(s2);
    }
});

Ou si vous utilisez Java 8:

list.sort(String::compareToIgnoreCase);
denis.solonenko
la source
1
pouvez-vous me dire ce que sont les chaînes s1 et s2? et comment voir le résultat si la fonction de comparaison renvoie une valeur entière.
andro-girl
@seethalakshmi ce sont les chaînes de votre liste. Veuillez consulter les sources de la méthode Collections.sort si vous voulez obtenir plus de détails à ce sujet
denis.solonenko
je veux afficher la liste triée dans logcat, comment puis-je faire cela?
andro-girl
Il apparaîtra comme un objet, sauf si vous décomposez la liste avec une boucle après le tri. for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
Panier abandonné
2
@Dante si vous jetez un œil à l'implémentation de String.CASE_INSENSITIVE_ORDER, vous verrez que A1 est supérieur lessà A10 simplement parce que la longueur est plus petite. Il n'y a pas de support "de tri naturel"
prêt à l'emploi
195

La chose la plus simple à faire est:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
Djunod
la source
@djunod, merci pour la réponse. J'ai également essayé votre solution pour l'ArrayList de A1 à A10, mais l'A10 ne s'est pas trié correctement, tout comme la solution de denis.solenenko. D'une manière ou d'une autre, l'A10 va après A1. Fondamentalement, il a trié comme A1, A10, A2, A3, etc. Pourquoi est-ce arrivé et comment puis-je trier la liste correctement?
Dante
2
@dante, c'est le tri normal des chaînes. Si vous voulez qu'A2 vienne avant A10, vous devrez le changer en A02, etc.
djunod
1
Plus 1. A également travaillé sous Android. Merci et félicitations.
statosdotcom
@djunod Merci beaucoup :)
Kumar
stackoverflow devrait me fournir une option pour enregistrer des réponses / extraits comme celui-ci ..
HB.
29

essayez ce code

Collections.sort(yourarraylist, new SortBasedOnName());



import java.util.Comparator;
import com.RealHelp.objects.FBFriends_Obj;
import com.RealHelp.ui.importFBContacts;

public class SortBasedOnName implements Comparator
{
public int compare(Object o1, Object o2) 
{

    FBFriends_Obj dd1 = (FBFriends_Obj)o1;// where FBFriends_Obj is your object class
    FBFriends_Obj dd2 = (FBFriends_Obj)o2;
    return dd1.uname.compareToIgnoreCase(dd2.uname);//where uname is field name
}

}
pirate
la source
3
Très bonne réponse! Je pense que si vous changez 'implements Comparator' en 'implements Comparator <FBFriends_Obj> et que vous changez les types d'objets dans la comparaison à FBFriends_Obj, vous n'avez pas besoin de dd1 et dd2, vous pouvez utiliser o1 et o2 directement dans l'instruction de retour
FrinkTheBrave
11

Sur la base des réponses mentionnées ci-dessus, j'ai réussi à comparer mes objets de classe personnalisés comme ceci:

ArrayList<Item> itemList = new ArrayList<>();
...
Collections.sort(itemList, new Comparator<Item>() {
            @Override
            public int compare(Item item, Item t1) {
                String s1 = item.getTitle();
                String s2 = t1.getTitle();
                return s1.compareToIgnoreCase(s2);
            }

        });
Usman
la source
4

Vous devez utiliser un comparateur personnalisé qui utilisera compareToIgnoreCase, et non compareTo.

Vladimir Ivanov
la source
J'ai essayé ce lien.Mais je ne suis pas en mesure de trouver une solution.Pouvez-vous expliquer
andro-girl
3

À partir de Java 8, vous pouvez utiliser Stream:

List<String> sorted = Arrays.asList(
                          names.stream().sorted(
                              (s1, s2) -> s1.compareToIgnoreCase(s2)
                          ).toArray(String[]::new)
                      );

Il obtient un flux à partir de cela ArrayList, puis il le trie (en ignorant le cas). Après cela, le flux est converti en un tableau qui est converti en ArrayList.

Si vous imprimez le résultat en utilisant:

System.out.println(sorted);

vous obtenez la sortie suivante:

[ananya, Athira, bala, jeena, Karthika, Neethu, Nithin, seetha, sudhin, Swetha, Tony, Vinod]
ROMANIA_engineer
la source
3

Malheureusement, toutes les réponses à ce jour ne prennent pas en compte ce qui "a"ne doit pas être considéré comme égal "A"au tri.

String[] array = {"b", "A", "C", "B", "a"};

// Approach 1
Arrays.sort(array);
// array is [A, B, C, a, b]

// Approach 2
Arrays.sort(array, String.CASE_INSENSITIVE_ORDER);
// array is [A, a, b, B, C]

// Approach 3
Arrays.sort(array, java.text.Collator.getInstance());
// array is [a, A, b, B, C]

Dans l'approche 1, toutes les lettres minuscules sont considérées comme supérieures à toutes les lettres majuscules.

L'approche 2 aggrave les choses, car CASE_INSENSITIVE_ORDER considère "a"et est "A"égal (le résultat de la comparaison est 0). Cela rend le tri non déterministe.

L'approche 3 (en utilisant un java.text.Collator) est à mon humble avis le seul moyen de le faire correctement, car elle considère "a"et "A"n'est pas égale, mais les met dans le bon ordre en fonction de la locale actuelle (ou de toute autre locale souhaitée).

Lars Gendner
la source