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"].
如果您想要在类中提供不同的排序顺序并且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)
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)
我使用了以下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)
根据规范,乔恩的答案是正确的:
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)
结果将是: