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

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

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

}

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

        });


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]

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.