为了账号安全,请及时绑定邮箱和手机立即绑定

更新 ArrayList

更新 ArrayList

DIEA 2024-01-05 10:44:59
每当玩家输入数字时,我都会尝试更新我的棋盘(由数组列表中的三个数组列表组成)。该数字与棋盘上的一个正方形的对应关系如下:1 2 34 5 67 8 9我在更新网格时遇到问题。功能public static void playBoard(int choice, ArrayList<ArrayList<String>> board, boolean playerTurn) {    String val;    if (!playerTurn) {        val = "| X |";    }    else {        val = "| O |";    }    if (choice>=1 && choice<=3) {        System.out.println("H");        ArrayList<String> updateRow = board.get(0);        if (choice ==3) {            val+="\n";        }        updateRow.set(choice-1, val);        System.out.println(updateRow);        board.set(0, updateRow);        System.out.println(display(board));    }    else if (choice>=4 && choice<=6) {        System.out.println("H");        ArrayList<String> updateRow = board.get(1);        if (choice ==6) {            val+="\n";        }        updateRow.set((choice-4), val);        board.set(1, updateRow);        System.out.println(display(board));    }    else if (choice>=7 && choice<=9) {        System.out.println("H");        ArrayList<String> updateRow = board.get(2);        if (choice ==9) {            val+="\n";        }        updateRow.set(choice-7, val);        board.set(2, updateRow);        System.out.println(display(board));    }    else {        System.out.println("Input out of range");        return;    }}问题在于,当用户输入一个值时,该值对应的整个列都会更新,而不是单个方块。我已经检查过:只有一个 if 语句被触发。更新仅发生一次更新发生在正确的索引上。通过我的调试,我认为问题所在是:updateRow.set(choice-1, val);当用户(玩家1)输入1时:预期输出| X || - || - | | - || - || - | | - || - || - |实际产量| X || - || - | | X || - || - | | X || - || - |显示功能抱歉,我没有意识到你们需要看到这个其他功能
查看完整描述

2 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

问题似乎出现在创建中:您可能为每一行使用相同的列 ArrayList 对象。


// Error:

ArrayList<String> row = new ArrrayList<>();

row.add("...");

row.add("...");

row.add("...");

for (int i = 0; i < 3; ++i) {

    board.add(row);

}

本来应该:


for (int i = 0; i < 3; ++i) {

    ArrayList<String> row = new ArrrayList<>();

    row.add("...");

    row.add("...");

    row.add("...");

    board.add(row);

}

同样的概念错误意味着:不需要这样做:

board.set(2, updateRow); // Not needed.

更改板持有的 updateRow 对象中的条目是通过引用完成的。

一些技巧:

  • 这里可以使用String[][].

  • 将显示/视图(字符串)与数据模型(字符?)分开更容易,所以也许char[][] board = new char[3][3];


查看完整回答
反对 回复 2024-01-05
?
侃侃无极

TA贡献2051条经验 获得超10个赞

我已经使用了您的代码并添加了显示功能,它给了我预期的输出。我想您可能需要检查显示功能或创建板的方式。下面是我使用的显示功能


 public static String display(ArrayList<ArrayList<String>> board) {

     String output = "";

     for(ArrayList<String> list : board) {

         for(String s:list){

             output += s ;

         }

         output += "\n";

     }

     return output;


 }


查看完整回答
反对 回复 2024-01-05
  • 2 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信