如何按枚举顺序对列表<enum,collection =“”>进行排序?</enum,>

时间:2012-11-19 07:26:53

标签: java collections enums

枚举:

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

如何根据枚举顺序对列表进行排序?

10 个答案:

答案 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,一种方法是:

  1. class A实现Comparable界面,包括编写int compare(A other)方法。
  2. 致电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);