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

时间:2011-03-04 04:31:29

标签: java enums comparator

我正在编写一个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
}

有没有办法可以重写我的枚举,以便它自然排序,而不必为每个定义权重或开关?

3 个答案:

答案 0 :(得分:3)

我想到了三个解决方案:

  1. 您可以按需要的顺序指定枚举常量,并在比较器中使用p.ordinal()。
  2. 您可以将排序索引指定为枚举常量的参数,例如: ACTION1(3),ACTION2(4),ACTION3(1),并在枚举中提供一个构造函数,用于将参数存储到您在比较器中使用的字段。
  3. 创建一个进程列表,按所需顺序添加所有常量,然后在比较器中使用list.indexOf。这比接近1或2慢,但这可能不是问题,具体取决于您使用它的位置。

答案 1 :(得分:2)

要扩展msell的答案#3(保留一个列表并使用indexOf来计算排序顺序),这在使用{Guava library的高度推荐(至少是我)Ordering中非常容易。 {3}}课程:

private static final List<AgentProcess> PREFERRED_ORDER = ImmutableList.of(ACTION1, ACTION19, ACTION27 /* ... */);
private static final Comparator<AgentProcess> PROCESS_COMPARATOR = Ordering.explicit(PREFERRED_ORDER);

非常好,恕我直言。

答案 2 :(得分:0)

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! */

整洁,我从未想过我会在任何语言中看到附着在枚举上的浮子。 :)