Подтвердить что ты не робот

Сортировка Java на основе констант Enum

Мы имеем перечисление

enum listE {
    LE1,
    LE4,
    LE2,
    LE3
}

Кроме того, у нас есть список, содержащий строки ["LE1","LE2","LE3","LE4"]. Есть ли способ отсортировать список на основе определенного порядка перечисления (а не естественного порядка String).

Сортированный список должен быть ["LE1", "LE4", "LE2", "LE3"].

4b9b3361

Ответ 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]