基于枚举常量的Java排序

Suk*_*hhh 44 java sorting enums

我们有一个枚举

enum listE {
    LE1,
    LE4,
    LE2,
    LE3
}
Run Code Online (Sandbox Code Playgroud)

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

排序列表应该是["LE1", "LE4", "LE2", "LE3"].

Jon*_*eet 76

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

  • 如果您使用EnumSet,则它已按顺序排序.;) (4认同)
  • @PeterLawrey:好点 - 但没有重复:) (4认同)

App*_*evo 8

如果您想要在类中提供不同的排序顺序并且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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

然后使用

Collections.sort(myList, new MyComparator());
Run Code Online (Sandbox Code Playgroud)


Jig*_*shi 7

values() method按照定义的顺序返回.

enum Test{
  A,B,X,D
}

for(Test t: Test.values()){
  System.out.println(t);
}
Run Code Online (Sandbox Code Playgroud)

产量

A
B
X
D
Run Code Online (Sandbox Code Playgroud)

  • 这无助于按声明顺序排序。 (3认同)

Cyr*_* Ka 6

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


Wat*_*att 6

我使用了以下List<theEnum> 按升序排序,它对我来说很好.

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

  • 这与要求的完全相反:按字典顺序而不是按声明顺序排序。 (2认同)

Agr*_*ola 6

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

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);
}
Run Code Online (Sandbox Code Playgroud)

结果将是:

  • 原列表:[LE1、LE2、LE3、LE4]
  • 排序列表:[LE1、LE4、LE2、LE3]