web-dev-qa-db-fra.com

Tri Java en fonction de constantes Enum

Nous avons un enum 

enum listE {
    LE1,
    LE4,
    LE2,
    LE3
}

De plus, nous avons une liste qui contient les chaînes ["LE1","LE2","LE3","LE4"]. Existe-t-il un moyen de trier la liste en fonction de l'ordre défini enum (et non de l'ordre naturel String).

La liste triée doit être ["LE1", "LE4", "LE2", "LE3"].

41
Sukhhhh

Enum<E> implémente Comparable<E> via l'ordre naturel de l'énum (l'ordre dans lequel les valeurs sont déclarées). Si vous créez simplement une liste des valeurs enum (au lieu de chaînes) via l'analyse, puis triez cette liste à l'aide de Collections.sort, le tri doit être effectué comme vous le souhaitez. Si vous avez à nouveau besoin d'une liste de chaînes, vous pouvez simplement reconvertir en appelant name() sur chaque élément.

66
Jon Skeet

La méthode values() revient dans l'ordre dans lequel elle a été définie.

enum Test{
  A,B,X,D
}

for(Test t: Test.values()){
  System.out.println(t);
}

Sortie

A
B
X
D
7
Jigar Joshi

Après, j’ai utilisé pour trier mon List<theEnum> par ordre croissant, et cela a fonctionné pour moi.

Collections.sort(toSortEnumList, new Comparator<theEnum>() {
                @Override
                public int compare(theEnum o1, theEnum o2) {
                    return o1.toString().compareTo(o2.toString());
                }
            });
5
Watt

Si vous voulez un ordre de tri différent dans la classe Enum et que vous ne pouvez pas le modifier, attribuez simplement int à vos champs enum et comparez-le:

public class MyComparator implements Comparator<ListE> {

    @Override
    public int compare(ListE o1, ListE o2) {
        return Integer.compare(getAssignedValue(o1), getAssignedValue(o2));
    }

    int getAssignedValue(ListE listE) {
        switch (listE) {
            case LE2:
                return 0;
            case LE1:
                return 1;
            case LE4:
                return 2;
            case LE3:
                return 3;
            default:
                return Integer.MAX_VALUE;
        }
    }

}

et ensuite utiliser

Collections.sort(myList, new MyComparator());
2
AppiDevo
public class Student implements Comparable<Student>{

    public String studentName;

    public Student(String name,DayInWeek weekDay){
        this.studentName = name;
        this.studentDays = weekDay;
    }

    public enum DayInWeek {
        SATURDAY, SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
    }
    public DayInWeek studentDays;

    @Override
    public int compareTo(Student s1) {
        if(s1.studentDays.ordinal() < this.studentDays.ordinal())
            return 1;
        else if(s1.studentDays.ordinal() > this.studentDays.ordinal())
            return -1;
        else
            return 1;
    }
}
2
Ankush Rasse

vous devriez probablement regarder la méthode ordinal () de l'énum, ​​elle retourne un Integer de la position où le type enum apparaît dans la classe enum, donc dans votre cas, LE1 = 0, LE4 = 1, etc ...

2
kevin the kitten

Chaque constante enum a une valeur ordinale correspondant à sa position dans la déclaration enum. Vous pouvez écrire un comparateur pour vos chaînes en utilisant la valeur ordinale de la constante d’énumération correspondante.

2
Cyrille Ka

Essayez d'utiliser :

ajouter au champ enum (champ trié)

comme 

enum MyEnum{
 private String sorted;
 MyEnum(String sorted){
  this.sorted = sorted;
 }
 String getSorted(){
  return this.sorted;
 }
}

Utilisez TreeSet

Implémenter Comparator en utilisant MyEnum.sorted classé

1

Si vous voulez trier par ordinal, vous pouvez utiliser valueOf pour convertir la chaîne et les ajouter à un EnumSet (qui est trié par ordinal).

Sinon, vous pouvez trier les valeurs en fonction d'un attribut de l'énum. (Cela peut être plus robuste et ne dépendre pas de l'ordre dans lequel les énumérations sont déclarées) Utilisez valueOf et écrivez un comparateur personnalisé.

0
Peter Lawrey