简体   繁体   中英

Proper way to handle “check list” of items

I have a process that must complete a set of tasks. It is possible that the process will try attempt a task that has already been completed, in which case it should ignore the attempt and generate a request to complete another task. I am not sure of a good way to track which tasks are completed and which still need to be processed.

I will use the game "Yahtzee" as an example to demonstrate how I am currently handling this. I first create the list of tasks, in this case the scoring combinations:

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

When the player uses one of these combinations, I remove it from the arraylist, in this case the "small straight" combination:

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;
}

Once all of the combinations have been used, the game ends.

Using an array list seems very primitive to me, not to mention ugly. I have considered using a Map<String, Boolean> and then just marking the object as false once it has been used, but I would assume there is already some "standard" way of doing this much more elegant.

If a primitive solution works, then that's often the best solution. Why make it more complicated?

The only disadvantage I can see with using just an ArrayList is that searching in it is slow. Using a Map for this would be better.

But it may be even better if you created a class that knows whether it was already used and put that into a map.

Your arraylist example may be a bit inefficient for what you're doing, and it has the possibility of accidentally mistyping an action. If you have a set number of actions, why not keep them in a boolean array?

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

Then you can set it after finishing:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM