我正在编写一个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
}
有没有办法可以重写我的枚举,以便它自然排序,而不必为每个定义权重或开关?
答案 0 :(得分:3)
我想到了三个解决方案:
答案 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! */
整洁,我从未想过我会在任何语言中看到附着在枚举上的浮子。 :)