基本上,我在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);
    }
}

08-18 06:20
查看更多