Java将“this”作为参数传递不会存储更改

4dc9hkyq  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(117)

我正在做一个人工智能游戏,其中CPU使用统一成本搜索算法将N个编号的立方体堆叠在3行的表中。我尝试做的是generateMoves()方法,它将返回一个ArrayList,其中包含从给定状态开始的所有可能的移动。
Cube是一个表示具有自己的ID(立方体的编号)、X轴位置和Y轴位置的立方体的类。
K是用户输入
getCubes()是一个返回ArrayList<Cube>的方法,它是表的当前状态。
setCubes()是一个接受ArrayList<Cube>并将该列表设置为当前状态的方法。
isValid()是一个Cube方法,它检查copyOfTable列表中给定的多维数据集是否处于有效位置。
isFree()是一个Cube方法,它检查copyOfTable列表是否可以自由移动给定的多维数据集。

public class Table{
  private fields

  constructor{}

  public Arraylist<Table> generateMoves(){
    Arraylist<Table> moves = new ArrayList<Table>();
    ArrayList<Cube> currentTable = this.getCubes();
    ArrayList<Cube> copyOfTable = new ArrayList<Cube>(currentTable);

    int X = 1;
    int Y = 1;
    int K = this.getK();

    for(Cube cube : currentTable){
      int backupX = cube.getPosX();
      int backupY = cube.getPosY();

      for(Y = 1; Y <= 3; Y++){
        for(X = 1; X <= 4*K; X++){
          cube.setPosX(X);
          cube.setPosY(Y);
          if(cube.isValid(copyOfTable) && cube.isFree(copyOfTable)){
            this.setCubes(currentTable);

            moves.add(this);

            moves.get(0).printTable();

          }else{
            cube.setPosX(backupX);
            cube.setPosY(backupY);
            continue;
          }
        }
      }
    }

    moves.get(anyIndex).printTable();

    return moves;
  }
}
// main is in a different file
main(){
  ArrayList<Table> moves = new ArrayList<Table>();
  Table table = new Table();
  
  moves = table.generateMoves();
}

我想要的是moves.add(this)moves数组列表中添加电路板的当前状态,这样我就可以返回给定表可能生成的所有表(状态)。
问题是第一个printTable()(在第三个for循环中)打印了可以生成的每个状态。不仅是我第一次问的。
第二个printTable()(在return语句上面),不管索引是什么,都只打印表的第一个状态。
我错过了什么?
我尝试了上面的代码

r1zhe5dt

r1zhe5dt1#

  • "...我在这里错过了什么?..."*

您的代码是正确的,您只是误解了 generateMoves 方法的上下文。
返回的 ArrayList 将不会持久化,对于每个调用,将有一个新的 ArrayList
这种类型的方法需要放在不同的类中。
其中,您可以使用 ArrayList 类字段来填充列表。
请考虑以下情况。
通过将 Table 对象传递给 generateMoves,可以填充类字段 moves

class TableUtil {
    static ArrayList<Table> moves = new ArrayList<>();

    static ArrayList<Table> getMoves() {
        return moves;
    }
    
    static void generateMoves(Table table) {
        ArrayList<Cube> currentTable = table.getCubes();
        ArrayList<Cube> copyOfTable = new ArrayList<Cube>(currentTable);

        int X = 1;
        int Y = 1;
        int K = table.getK();

        for(Cube cube : currentTable){
            int backupX = cube.getPosX();
            int backupY = cube.getPosY();

            for(Y = 1; Y <= 3; Y++){
                for(X = 1; X <= 4*K; X++){
                    cube.setPosX(X);
                    cube.setPosY(Y);
                    if(cube.isValid(copyOfTable) && cube.isFree(copyOfTable)){
                        table.setCubes(currentTable);

                        moves.add(table);

                        moves.get(0).printTable();

                    }else{
                        cube.setPosX(backupX);
                        cube.setPosY(backupY);
                        continue;
                    }
                }
            }
        }

        moves.get(table.anyIndex).printTable();
    }
}

创建 Table 对象,然后为每个示例调用 generateMoves 方法。
比如说

Table tableA = new Table();
Table tableB = new Table();
Table tableC = new Table();

TableUtil.generateMoves(tableA);
TableUtil.generateMoves(tableB);
TableUtil.generateMoves(tableC);

ArrayList<Table> moves = TableUtil.getMoves();

相关问题