枚举:
public enum ComponentType {
INSTRUCTION, ACTION, SERVICE, DOMAIN, INTEGRATION, OTHER, CONTEXT;
}
A类:
public class A
{
String name;
ComponentType c;
public A(String name, ComponentType c)
{
this.name = name;
this.c = c;
}
}
代码:
List<A> l = new ArrayList<A>();
l.add(new A("ZY", ACTION));
l.add(new A("ZY0", INSTRUCTION));
l.add(new A("ZY1", DOMAIN));
l.add(new A("ZY2", SERVICE));
l.add(new A("ZY3", INSTRUCTION));
l.add(new A("ZY4", ACTION));
如何根据枚举顺序对列表进行排序?
答案 0 :(得分:5)
您应该简单地委托已经提供的enum compareTo()方法并反映声明顺序(基于ordinal
值):
Collections.sort(list, new Comparator() {
@Override
public int compare(A a1, A a2) {
return a1.getType().compareTo(a2.getType());
}
});
或者,如果您认为组件类型为元素提供了“自然顺序”,则可以使A类本身实现Comparable
并将compareTo
方法委托给{{1一个。
答案 1 :(得分:1)
使工具可比较。如果要按枚举名称排序,请使用此compareTo方法:
public int compareTo(A a) {
return a.c.getName().compareTo(c.getName());
}
如果您想按照键入枚举的顺序排序,请比较序数值:
public int compareTo(A a) {
return a.c.ordinal().compareTo(c.ordinal());
}
答案 2 :(得分:1)
根据java.util.Collections.sort,一种方法是:
class A
实现Comparable
界面,包括编写int compare(A other)
方法。Collections.sort(l);
答案 3 :(得分:1)
看来您应该使用EnumMap,因为它们按键自然排序。
public static void add(Map<ComponentType, List<A>> map, A a) {
List<A> as = map.get(a.c);
if(as == null) map.put(a.c, as = new ArrayList<A>());
as.add(a);
}
Map<ComponentType, List<A>> map = new EnumMap<ComponentType, List<A>>(ComponentType.class);
add(map, new A("ZY", ComponentType.ACTION));
add(map, new A("ZY0", ComponentType.INSTRUCTION));
add(map, new A("ZY1", ComponentType.DOMAIN));
add(map, new A("ZY2", ComponentType.SERVICE));
add(map, new A("ZY3", ComponentType.INSTRUCTION));
add(map, new A("ZY4", ComponentType.ACTION));
答案 4 :(得分:1)
如果需要根据ENUM对类进行排序,为了保持一致性,我们必须使用ENUM的compareTo(如果是最终的)方法。
将此方法添加到A类将有助于保持一致的行为。
@Override
public int compareTo(A o) {
return this.c.compareTo(o.c);
}
答案 5 :(得分:0)
首先 - 开始使用Generics。所以你的代码应该是
List<A> l = new ArrayList<A>();
对于你的问题,让你的A类实现Comparable
并重写方法compareTo,你可以在其中放置表达式进行排序。 Example here
答案 6 :(得分:0)
Enum compareTo似乎是最终的,不能被覆盖 Why is compareTo on an Enum final in Java?
只需执行Collections.sort(),它将根据需要以枚举顺序对列表进行排序
答案 7 :(得分:0)
以下是您需要做的事情:
List<A> l = new ArrayList<A>();
l.add(new A("ZY", ComponentType.ACTION));
l.add(new A("ZY0", ComponentType.INSTRUCTION));
l.add(new A("ZY1", ComponentType.DOMAIN));
l.add(new A("ZY2", ComponentType.SERVICE));
l.add(new A("ZY3", ComponentType.INSTRUCTION));
l.add(new A("ZY4", ComponentType.ACTION));
Collections.sort(l, new Comparator<A>()
{
@Override
public int compare(A o1, A o2)
{
return o1.c.toString().compareTo(o2.c.toString());
}
});
答案 8 :(得分:0)
首先,你没有List<Enum, Collection>
因为这是不可能的,你有一个List<A>
并且声明如下:
List<A> list = new LinkedList<>();
您正尝试在接口中实例化,这是不可能的,并且是编译时错误。
如果你想对A
的列表进行排序,你应该进行比较:
public class A implements Comparable<A>
并覆盖compareTo()
方法,如下所示:
@Override
public int compareTo(A other) {
return c.ordinal() - other.c.ordinal();
}
要对列表进行排序,您可以致电:
Collections.sort(list);
答案 9 :(得分:0)
我遇到了同样的问题,但我无法修改我的Enum
课程,订单错误。这就是我无法在枚举对象上使用简单compareTo
的原因。解决方案非常简单,只需为每个Enum字段分配int值,然后进行比较:
public class MyComparator implements Comparator<A> {
@Override
public int compare(A o1, A o2) {
return Integer.compare(getAssignedValue(o1.getComponentType()), getAssignedValue(o2.getComponentType()));
}
int getAssignedValue(ComponentType componentType) {
switch (componentType) {
case OTHER:
return 0;
case CONTEXT:
return 1;
case SERVICE:
return 2;
case DOMAIN:
return 3;
case INTEGRATION:
return 4;
case ACTION:
return 5;
case INSTRUCTION:
return 6;
default:
return Integer.MAX_VALUE;
}
}
}
然后:
Collections.sort(list, new MyComparator);