Сортировка Java на основе констант Enum
Мы имеем перечисление
enum listE {
LE1,
LE4,
LE2,
LE3
}
Кроме того, у нас есть список, содержащий строки ["LE1","LE2","LE3","LE4"]
. Есть ли способ отсортировать список на основе определенного порядка перечисления (а не естественного порядка String
).
Сортированный список должен быть ["LE1", "LE4", "LE2", "LE3"]
.
Ответы
Ответ 1
Enum<E>
реализует Comparable<E>
через естественный порядок перечисления (порядок, в котором объявляются значения). Если вы просто создаете список значений enum (вместо строк) с помощью синтаксического анализа, затем сортируйте этот список с помощью Collections.sort
, он должен сортироваться так, как вы хотите. Если вам нужен список строк снова, вы можете просто преобразовать обратно, вызвав name()
для каждого элемента.
Ответ 2
values()
метод возвращает в том порядке, в котором он определен.
enum Test{
A,B,X,D
}
for(Test t: Test.values()){
System.out.println(t);
}
Выход
A
B
X
D
Ответ 3
Я использовал следующий, чтобы отсортировать мой List<theEnum>
в порядке возрастания, и это сработало для меня.
Collections.sort(toSortEnumList, new Comparator<theEnum>() {
@Override
public int compare(theEnum o1, theEnum o2) {
return o1.toString().compareTo(o2.toString());
}
});
Ответ 4
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;
}
}
Ответ 5
вы должны, вероятно, посмотреть на метод ordinal() перечисления, он возвращает целое число позиции, которое тип перечисления появляется в классе enum, поэтому в вашем случае LE1 = 0, LE4 = 1 и т.д.
Ответ 6
Каждая константа перечисления имеет ordinal значение, соответствующее его положению в объявлении перечисления. Вы можете написать компаратор для своих строк, используя порядковое значение соответствующей константы перечисления.
Ответ 7
Если вам нужен другой порядок сортировки, предусмотренный в классе Enum
, и вы не можете его изменить, просто назначьте int
вашим полям перечисления и сравните его:
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;
}
}
}
а затем используйте
Collections.sort(myList, new MyComparator());
Ответ 8
Попробуйте использовать:
добавить в поле перечисления (отсортированное поле)
like
enum MyEnum{
private String sorted;
MyEnum(String sorted){
this.sorted = sorted;
}
String getSorted(){
return this.sorted;
}
}
Используйте TreeSet
Внедрить Comparator
с помощью MyEnum.sorted
filed
Ответ 9
Если вы хотите сортировать по порядку, вы можете использовать valueOf
для преобразования строки и добавления их в EnumSet (который сортируется по порядку)
В противном случае вы можете отсортировать значения на основе атрибута перечисления. (Это может быть более надежным и не зависящим от порядка, объявляемого перечислением) Используйте значениеOf и напишите собственный Компаратор.
Ответ 10
Jon ответ правильный в спецификации:
Enum реализует Comparable через естественный порядок перечисления (порядок, в котором объявлены значения).
Однако я хотел оставить пример Java8 на тот случай, если кто-то захочет отобразить строковые значения в enum и отсортировать по порядку enum. При этом вы можете отобразить ваши строки в enum, отсортировать, используя сопоставимый по умолчанию, а затем отобразить его обратно, используя toString
. Это оставляет вас с чем-то вроде этого:
enum listE {
LE1,
LE4,
LE2,
LE3
}
public static void main(String[] args) {
List<String> originalList = Arrays.asList("LE1", "LE2", "LE3", "LE4");
System.out.println("Original List: " + originalList);
List<String> sortedList = originalList.stream()
.map(listE::valueOf)
.sorted(listE::compareTo)
.map(listE::toString)
.collect(Collectors.toList());
System.out.println("Sorted List: " + sortedList);
}
Результат будет:
- Исходный список: [LE1, LE2, LE3, LE4]
- Сортированный список: [LE1, LE4, LE2, LE3]