2011-06-19 36 views
0

我有一個必須完成一組任務的過程。該過程可能會嘗試嘗試已經完成的任務,在這種情況下,它應該忽略嘗試並生成完成其他任務的請求。我不確定追蹤哪些任務已完成,哪些仍需要處理的好方法。處理項目「檢查列表」的正確方法

我會用遊戲「Yahtzee」作爲例子來演示我目前如何處理這個。我首先創建的任務列表,在這種情況下,得分組合:

combinations = new ArrayList<String>(); 
combinations.add("one"); 
combinations.add("two"); 
... 
combinations.add("fullhouse"); 
combinations.add("smallstraight"); 
combinations.add("yahtzee"); 
... 

當玩家使用這些組合之一,我從ArrayList中刪除它,在這種情況下,「小直」組合:

public void selectSmallStraight() { 
    int index = combinations.indexOf("smallstraight"); 
    if(index < 0) 
     System.out.println("Small Straight already used"); 
     //Prompt the player for another selection 
    else 
     combinations.remove(index); 
     score += 30; 
} 

一旦使用了所有的組合,遊戲就結束了。

使用數組列表對我來說看起來很原始,更不用說醜陋了。我已經考慮過使用Map<String, Boolean>,然後只要將它標記爲假,但我會認爲已經有一些「標準」的方式來做這件事更加優雅。

回答

1

您的數組列表示例對於您正在做的事情可能有點低效,並且可能會意外地誤導某個動作。如果你有一組動作,爲什麼不把它們保存在一個布爾數組中呢?

final static int FIRSTACTION = 0; 
final static int SECONDACTION = 1; 
final static int LASTACTION = 2; 
boolean[] actionsFinished = new boolean[3]; 

然後你就可以辦完設置:

//Do first action code goes here 
actionsFinished[FIRSTACTION] = true; 
2

如果原始解決方案有效,那通常是最好的解決方案。爲什麼使它更復雜?

我可以看到只使用ArrayList的唯一缺點是搜索速度很慢。爲此使用Map會更好。

但是,如果您創建了一個知道它是否已被使用並將其放入地圖的類,它可能會更好。

+0

的主要問題我有一個ArrayList的方法是性能,就像你說。 – CalMlynarczyk

+1

@Kededro因此,一個依賴HashMap的HashSet可以完成這項工作 – Omnaest

相關問題