我们有一个枚举
enum listE {
LE1,
LE4,
LE2,
LE3
}
此外,我们有一个包含字符串["LE1","LE2","LE3","LE4"]
的列表。有没有办法根据枚举定义的顺序(而不是自然的String
顺序)对列表进行排序。
排序列表应为["LE1", "LE4", "LE2", "LE3"]
。
答案 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);
}
结果将是:
答案 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);
}