我有一个必须完成一系列任务的流程。该进程可能会尝试尝试已完成的任务,在这种情况下,它应该忽略该尝试并生成完成另一个任务的请求。我不确定跟踪哪些任务已完成以及哪些仍需要处理的好方法。
我将以游戏“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,但我认为已经有一些“标准”的方法可以更加优雅。
答案 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;