基于枚举常量的Java排序

时间:2011-11-04 09:23:49

标签: java sorting enums

我们有一个枚举

enum listE {
    LE1,
    LE4,
    LE2,
    LE3
}

此外,我们有一个包含字符串["LE1","LE2","LE3","LE4"]的列表。有没有办法根据枚举定义的顺序(而不是自然的String顺序)对列表进行排序。

排序列表应为["LE1", "LE4", "LE2", "LE3"]

11 个答案:

答案 0 :(得分:71)

Enum<E>通过枚举的自然顺序(声明值的顺序)实现Comparable<E>。如果您只是通过解析创建枚举值(而不是字符串)的列表,然后使用Collections.sort对该列表进行排序,它应该按您想要的方式排序。如果您需要再次使用字符串列表,则可以通过在每个元素上调用name()来转换回来。

答案 1 :(得分:7)

values()方法按照定义的顺序返回。

enum Test{
  A,B,X,D
}

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

<强>输出

A
B
X
D

答案 2 :(得分:5)

我使用了以下按升序对List<theEnum>进行排序,对我来说效果很好。

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

答案 3 :(得分:2)

你应该看一下enum的ordinal()方法,它返回enum类在enum类中出现的位置的Integer,所以在你的情况下LE1 = 0,LE4 = 1,等等...... / p>

答案 4 :(得分:2)

每个枚举常量都有一个ordinal值,对应于它在枚举声明中的位置。您可以使用相应枚举常量的序数值为字符串编写比较器。

答案 5 :(得分:2)

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;
    }
}

答案 6 :(得分:2)

如果您希望在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());

答案 7 :(得分:1)

尝试使用:

添加到枚举字段(已排序字段)

喜欢

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

使用TreeSet

使用Comparator提交的<{1}}实施MyEnum.sorted

答案 8 :(得分:1)

根据规范,乔恩的答案是正确的:

  

Enum通过枚举的自然顺序(声明值的顺序)实现Comparable。

但是,如果有人想要将字符串值映射到枚举并按枚举顺序排序,我想留下一个Java8示例。这样,您可以将字符串映射到枚举,使用默认的可比字符串进行排序,然后使用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]

答案 9 :(得分:0)

如果您想按顺序排序,可以使用valueOf转换字符串并将其添加到EnumSet(按顺序排序)

否则,您可以根据枚举的属性对值进行排序。 (这可能更强大,并且不依赖于枚举声明的顺序)使用valueOf并编写自定义Comparator。

答案 10 :(得分:0)

这里是您可以添加到枚举中以获得排序后的枚举常量数组的方法:

  • “元素”是枚举的名称

  • 其中枚举按其toString排序

    public static Element[] getSortedValues(){
        return Stream.of(values()).sorted((o1,o2)->
        {
            return o1.toString().compareTo(o2.toString());
        }).
        toArray(Element[]::new);
    }