2011-06-19 10 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>を使って考えてみましたが、いったん使用されるとそのオブジェクトをfalseとマークしていますが、これをもっと優雅にするための "標準的な"方法がすでにあると思います。

答えて

1

arraylistの例は、あなたがやっていることに対して少し非効率的であり、誤ってアクションを誤って入力する可能性があります。設定された数のアクションがある場合は、ブール値の配列でそれらを保持してください。

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

関連する問題