基本上,我在MVC中制作yahtzee游戏。它工作正常,但是当我尝试保存游戏会话时,它不会保存包含和玩家列表的游戏对象。这不会停止执行,这肯定会清除游戏的数组列表。
基本上,游戏实例具有以下字段:
public String name;
public int numberOfPlayers;
public ArrayList<Player> players = new ArrayList<>();
int playerListIndex;
ArrayList<Boolean> checkable;
StandardRules yahtzeeRule = new StandardRules();
public int rounds;
public String date;
Player的Arraylist包含对象Player的实例,该对象具有自己的字段和getters / setters。
我设法跟踪了在我调用该方法时无法保存的问题:
public void saveGame(Game thisGame) {
DB.saveGame(thisGame);
}
依次调用该类:
public class DB {
private static ArrayList<Game> savedGames = new ArrayList<>();
/**
* Saves the passed member into the database.
* @param game, the member to be saved.
*/
public static void saveGame(Game game) {
for (Game g : savedGames) {
if (g.name.equals(game.name)) {
savedGames.remove(g);
savedGames.add(game);
}
else {
savedGames.add(game);
}
}
}
saveGame方法基本上检查已保存游戏的数组列表(如果该名称已经存在),如果存在,它将删除旧游戏并添加新游戏。如果没有该名称的游戏,它将仅将游戏添加到列表中。 (我可能稍后再实现一个MYSQL DB,但是为了确保程序首先运行,我想使用arraylist进行测试)
我的印象是,我需要对数据库有一个静态引用,以确保我一直在尝试访问同一数据库,并且不会混淆数据库的实例。
我在这里做错了什么?
最佳答案
尝试遵循逻辑。您正在遍历数组以保存游戏。如果数组为空,您期望发生什么?如果数组有六个元素,那么您希望该列表中包含什么?此外,如果此循环将使用List中已经存在的名称执行,则很可能会遇到ConcurentModificationException。您可能想要遍历List并将副本存储到变量中。但是不要在循环中进行保存和删除。
因此,最终您的问题是,您要遍历空列表以保存Game
,实际上这是行不通的,因为您的List
为空,您将永远无法到达将某些内容添加到List
的位置。 。
您最有可能寻求将游戏存储在List
中的解决方案。
public static void saveGame(Game game) {
Game dupGame = null;
for (Game g : savedGames) {
if (g.name.equals(game.name)) {
dupGame = g;
}
}
if (dupGame != null) {
savedGames.remove(dupGame );
}
savedGames.add(game);
}
编辑:
您还可以使用
Map
,这将使查找重复项等变得更快,更容易。public class DB {
private static Map<String,Game> savedGames = new HashMap<>();
/**
* Saves the passed member into the database.
*
* @param game
* , the member to be saved.
*/
public static void saveGame(Game game) {
savedGames.put(game.name.toLowerCase(), game);
}
}