2011-03-04 68 views
1

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

三种解决方案来我的脑海:

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

因此,如果我使用自然顺序,比较工作在哪个方向进行?也就是说,如果它们在Enum中列为“ACTION1,ACTION2,ACTION3”,它是指ACTION1> ACTION2> ACTION3或ACTION1 donnyton 2011-03-04 06:24:08

+0

这取决于你的比较器。返回a.ordinal() - b.ordinal();将它们命令为ACTION1,ACTION2,...和b.ordinal() - a.ordinal()进行反向排序。 – msell 2011-03-04 06:31:33

+0

PriorityQueue的默认构造函数说它按自然顺序对它们进行排序。这个订单是最小的吗?也就是说,在上面的列表中,默认情况下ACTION1在ACTION3前面走在ACTION3前面? – donnyton 2011-03-05 06:27:06

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

整洁,我从来没有想过我会看到对连接到枚举任何语言花车。 :)

2

要在msell的答案#3(保持一个列表,并使用的indexOf摸出排序顺序)扩大,这是高度推荐的(至少我)Guava library很轻松,使用Ordering类:

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

非常好,恕我直言。

+0

这很漂亮 – ide 2011-03-04 06:56:43