111 votes

Comment trier une liste<Object> par ordre alphabétique en utilisant le champ Nom de l'objet

J'ai une liste d'objets comme List<Object> p .Je souhaite trier cette liste par ordre alphabétique à l'aide du champ Nom de l'objet. L'objet contient 10 champs et le champ de nom est l'un d'entre eux.

 if (list.size() > 0) {
    Collections.sort(list, new Comparator<Campaign>() {
        @Override
        public int compare(final Object object1, final Object object2) {
        return String.compare(object1.getName(), object2.getName());
        }
    } );
}

Mais il n'y a rien comme String.compare..?

248voto

Robert B Points 792

D'après votre code, il semble que votre Comparator soit déjà paramétré avec Campaign . Cela ne fonctionnera qu'avec List<Campaign> . De plus, la méthode que vous recherchez est compareTo .

 if (list.size() > 0) {
  Collections.sort(list, new Comparator<Campaign>() {
      @Override
      public int compare(final Campaign object1, final Campaign object2) {
          return object1.getName().compareTo(object2.getName());
      }
  });
}

Ou si vous utilisez Java 1.8

 list
  .stream()
  .sorted((object1, object2) -> object1.getName().compareTo(object2.getName()));

Un dernier commentaire : il ne sert à rien de vérifier la taille de la liste. Trier fonctionnera sur une liste vide.

18voto

viktor Points 751

La façon la plus correcte de trier les chaînes par ordre alphabétique est d'utiliser Collator , en raison de l'internationalisation. Certaines langues ont un ordre différent en raison de quelques caractères supplémentaires, etc.

    Collator collator = Collator.getInstance(Locale.US);
   if (!list.isEmpty()) {
    Collections.sort(list, new Comparator<Campaign>() {
        @Override
        public int compare(Campaign c1, Campaign c2) {
            //You should ensure that list doesn't contain null values!
            return collator.compare(c1.getName(), c2.getName());
        }
       });
   }

Si vous ne vous souciez pas de l'internationalisation, utilisez string.compare(otherString) .

    if (!list.isEmpty()) {
    Collections.sort(list, new Comparator<Campaign>() {
        @Override
        public int compare(Campaign c1, Campaign c2) {
            //You should ensure that list doesn't contain null values!
            return c1.getName().compare(c2.getName());
        }
       });
   }

16voto

Oleksandr Points 7545

Utilisation de Java 8 Comparator.comparing :

 list.sort(Comparator.comparing(Campaign::getName));

12voto

codebrickie Points 6067

Jetez un œil à Collections.sort() et à l'interface Comparator

La comparaison de chaînes peut être effectuée avec object1.getName().compareTo(object2.getName()) ou object2.getName().compareTo(object1.getName()) (selon le sens de tri souhaité).

Si vous voulez que le tri soit indépendant de la casse, faites object1.getName().toUpperCase().compareTo(object2.getName().toUpperCase()) .

7voto

Ján Vorčák Points 3636
public class ObjectComparator implements Comparator<Object> {

    public int compare(Object obj1, Object obj2) {
        return obj1.getName().compareTo(obj2.getName());
    }

}

Veuillez remplacer Object par votre classe qui contient le champ de nom

Usage:

 ObjectComparator comparator = new ObjectComparator();
Collections.sort(list, comparator);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X