6

枚举:

 public enum ComponentType {
    INSTRUCTION, ACTION, SERVICE, DOMAIN, INTEGRATION,  OTHER, CONTEXT;
 }

甲类:

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

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

4

10 回答 10

6

您应该简单地委托给compareTo已经提供并反映声明顺序(基于ordinal值)的枚举方法:

Collections.sort(list, (a1, a2) -> a1.getType().compareTo(a2.getType()));        

或者,如果您认为组件类型为您的元素提供了“自然顺序”,您可以让 A 类本身实现Comparable并将compareTo方法委托给该类ComponentType

于 2012-11-19T07:33:04.500 回答
2

使 A 工具具有可比性。如果要按枚举名称排序,请使用以下 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());
}
于 2012-11-19T07:33:17.590 回答
2

我遇到了同样的问题,但我无法修改我的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);
于 2018-04-29T12:23:41.813 回答
1

如果需要根据 ENUM 对类进行排序,为了保持一致性,我们必须使用 ENUM 的 compareTo(which if final) 方法。

将此方法添加到 A 类将有助于并保持一致的行为。

@Override
public int compareTo(A o) {
    return this.c.compareTo(o.c);
}
于 2012-11-19T09:35:48.390 回答
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));
于 2012-11-19T08:29:45.400 回答
1

根据java.util.Collections.sort,一种方法是:

  1. class A实现接口,Comparable这包括编写int compare(A other)方法。
  2. 称呼Collections.sort(l);
于 2012-11-19T07:35:47.743 回答
0

首先,你没有 aList<Enum, Collection>因为这是不可能的,你有 aList<A>并且应该如下声明它:

List<A> list = new LinkedList<>();

您正在尝试在接口中实例化,这是不可能的,并且是编译时错误。

如果要对 List 进行排序,A则应进行比较:

public class A implements Comparable<A>

并重写compareTo()方法如下:

@Override
public int compareTo(A other) {
    return c.ordinal() - other.c.ordinal();
}

要对您的列表进行排序,您可以调用:

Collections.sort(list);

于 2012-11-19T07:45:12.107 回答
0

首先——开始使用泛型。所以你的代码将是

List<A> l = new ArrayList<A>();

对于您的问题,让您的 A 类实现Comparable并覆盖方法 compareTo ,您可以在其中放置表达式进行排序。这里的例子

于 2012-11-19T07:33:54.867 回答
0

Enum compareTo 似乎是最终的并且不能被覆盖 为什么 compareTo 在 Java 中的 Enum final 上?

只需执行 Collections.sort() 即可根据需要按枚举顺序对列表进行排序

于 2012-11-19T07:36:01.877 回答
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());
        }
    });
于 2012-11-19T07:36:41.313 回答