处理项目“检查清单”的正确方法

时间:2011-06-19 17:37:20

标签: java oop data-structures

我有一个必须完成一系列任务的流程。该进程可能会尝试尝试已完成的任务,在这种情况下,它应该忽略该尝试并生成完成另一个任务的请求。我不确定跟踪哪些任务已完成以及哪些仍需要处理的好方法。

我将以游戏“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,但我认为已经有一些“标准”的方法可以更加优雅。

2 个答案:

答案 0 :(得分:2)

如果原始解决方案有效,那么这通常是最佳解决方案。为什么要把它变得更复杂?

我只能使用ArrayList看到的唯一缺点是搜索速度很慢。使用Map会更好。

但是如果你创建了一个知道它是否已被使用的类并将其放入地图中,那可能会更好。

答案 1 :(得分: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;