2011-03-04 72 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