具有复杂枚举的优先级队列?

我正在用Java编写一个代理程序,它从程序中的各种其他对象接收对其服务的请求。限制是一次只能完成一个进程,这意味着PriorityQueue可能是表示其服务请求的最佳方式。 不幸的是,这些进程存储为具有许多不同状态的枚举。是否有一种简单的方法来编写比较器以我想要的方式订购这些状态?那是,
public enum AgentProcess
{
    ACTION1, ACTION2, ACTION3, ACTION4, ACTION20
}
与一些比较者
public class ProcessComparator<Process>
{
    public int compare(Process a, Process b)
    {
        //some arbitrary ordering of the processes, e.g., ACTION3 > ACTION19 > ACTION4...
    }
}
我现在坚持做类似的事情
public static int getValue(Process p)
{
    switch(p)
    case ACTION1:
         return 5;
    case ACTION2:
         return 29;
    case ACTION3:
         return 18;
    //etc
}
有没有办法我可以重写我的枚举,以便它自然有序,而不必为每个定义权重或开关?     
已邀请:
我想到了三种解决方案: 您可以按所需顺序指定枚举常量,并在比较器中使用p.ordinal()。 您可以将排序索引指定为枚举常量的参数,例如ACTION1(3),ACTION2(4),ACTION3(1),并在枚举中提供一个构造函数,用于将参数存储到您在比较器中使用的字段。 创建一个进程列表,按所需顺序添加所有常量,然后在比较器中使用list.indexOf。这比接近1或2慢,但根据您使用它的位置,这可能不是问题。     
要扩展msell的答案#3(保留一个列表并使用indexOf来计算排序顺序),这在使用
Ordering
类的高度推荐(至少是我)的Guava库中非常容易:
private static final List<AgentProcess> PREFERRED_ORDER = ImmutableList.of(ACTION1, ACTION19, ACTION27 /* ... */);
private static final Comparator<AgentProcess> PROCESS_COMPARATOR = Ordering.explicit(PREFERRED_ORDER);
非常好,恕我直言。     
从http://download.oracle.com/javase/tutorial/java/javaOO/enum.html无耻地偷走
public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7);
/* method declarations and more! */
整洁,我从没想过我会看到用任何语言附加在枚举上的浮子。 :)     

要回复问题请先登录注册