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"]
.
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.
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
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());
}
});
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());
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;
}
}
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 ...
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.
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é
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é.