Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中加载2d数组的所有值_Java_Arrays_2d_Indexoutofboundsexception - Fatal编程技术网

在java中加载2d数组的所有值

在java中加载2d数组的所有值,java,arrays,2d,indexoutofboundsexception,Java,Arrays,2d,Indexoutofboundsexception,我正在尝试创建一个2d益智滑块游戏。我创建了自己的名为gamestate的对象来存储父gamestate和新gamestate,因为我计划使用BFS解决它。示例数组如下所示 int[][] tArr = {{1,5,2},{3,4,0},{6,8,7}}; 这意味着 [1,5,2,, 3, 4, 0, 6、8、7] 为了存储这个状态,我使用了下面的for循环,它带来了indexoutbounds异常 public class GameState { public int[][] state;

我正在尝试创建一个2d益智滑块游戏。我创建了自己的名为gamestate的对象来存储父gamestate和新gamestate,因为我计划使用BFS解决它。示例数组如下所示

int[][] tArr = {{1,5,2},{3,4,0},{6,8,7}};
这意味着

[1,5,2,, 3, 4, 0, 6、8、7]

为了存储这个状态,我使用了下面的for循环,它带来了indexoutbounds异常

public class GameState {
public int[][] state; //state of the puzzle
public GameState parent; //parent in the game tree

public GameState() {
    //initialize state to zeros, parent to null
    state = new int[0][0];
    parent = null;
}

public GameState(int[][] state) {
    //initialize this.state to state, parent to null
    this.state = state;

    parent = null;
}

public GameState(int[][] state, GameState parent) {
    //initialize this.state to state, this.parent to parent
    this.state = new int[0][0];
    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 3; j++) {
            this.state[i][j] = state[i][j];
        }
    }

    this.parent = parent;
}
公共类游戏状态{
public int[][]状态;//拼图的状态
公共游戏状态父项;//游戏树中的父项
公共游戏状态(){
//将状态初始化为零,将父级初始化为空
状态=新整数[0][0];
parent=null;
}
公共游戏状态(int[][]状态){
//初始化此项。状态到状态,父项到null
this.state=状态;
parent=null;
}
公共游戏状态(int[][]状态,游戏状态父级){
//初始化this.state到state,this.parent到parent
this.state=新整数[0][0];
对于(int i=0;i<3;i++){
对于(int j=0;j<3;j++){
本.状态[i][j]=状态[i][j];
}
}
this.parent=parent;
}
有什么办法解决这个问题吗?

  • 对于
    GameState()
    构造函数(默认构造函数):
将此
state=new int[0][0];
更改为:
state=new int[
3
<3
][3];
。这样可以使用(3)x(3)个元素的容量初始化数组

  • 对于
    游戏状态(int[][]状态,游戏状态父级)
    构造函数:
将此
this.state=new int[0][0];
更改为
this.state=new int[
state.length
][
state.length>0?state[0]。长度:0
]

这样,您就可以使用以下容量初始化阵列:

state.length
)x(
state[0]。length
0
如果
state.length
0
)元素

此外,必须使用
i
state[i].length来设置循环直到
state.length
j

GameState
构造函数中,如下所示:

public GameState(int[][] state, GameState parent) {
    //initialize this.state to state, this.parent to parent
    this.state = new int[state.length][state.length > 0 ? state[0].length : 0];
    for (int i = 0; i < state.length; i++){
        for (int j = 0; j < state[i].length; j++) {
            this.state[i][j] = state[i][j];
        }
    }

    this.parent = parent;
}
公共游戏状态(int[][]状态,游戏状态父级){
//初始化this.state到state,this.parent到parent
this.state=new int[state.length][state.length>0?state[0]。长度:0];
for(int i=0;i

另外,作为旁注,它不是
[1,5,2,3,4,0,6,8,7]


但是问题出在初始化部分

this.state = new int[0][0];
此代码将创建一个零大小的二维数组。这就是为什么当您尝试在其中设置值时会出现indexOutOfBounds异常

如果要用零初始化数组,正确的语法为:

this.state = {{0,0,0},{0,0,0},{0,0,0}};
有关完整参考信息,请参见官方文件:

在第三个构造函数中,您正在初始化
此。状态为空数组。它没有元素,因此长度为
0
。使用for循环访问此数组的任何元素会引发
ArrayIndexOutOfBoundsException

由于要将
状态
作为参数传递,因此可能需要将其值复制到字段
状态

您可以这样做:

public GameState(int[][] state, GameState parent) {
    this.state = new int[state.length][];
    for (int i = 0; i < state.length; i++) {
        if (state[i] != null) {
            this.state[i] = Arrays.copyOf(state[i], state[i].length);
        }
    }

    this.parent = parent;
}
公共游戏状态(int[][]状态,游戏状态父级){
this.state=newint[state.length][];
for(int i=0;i
您当然可以调用
Arrays.of(state)
,但这不会返回
state
的深度副本。对于每个
i
,您将拥有
this.state[i]==state[i]



进一步阅读:

在第三个构造函数中,您正在使用
新int[0][0]
初始化
状态
。然后您无法访问数组的任何元素。作为旁注,它不是
[1,5,2,3,4,0,6,8,7]
,而是
[1,5,2],[3,4,0],[6,8,7]
。请参阅我的
此状态=状态=新int[3][3];
是一个更清晰的代码(它与
this.state={{0,0,0},{0,0,0},{0,0,0};
)。但是你的代码也很好。但是要考虑到
索引自动边界
不是在该构造函数
GameState()
中发生的,而是在这个构造函数中:
GameState(int[]state,GameState父级)
你在回答中没有提到。你是对的,
新int[3][3];
也会有同样的效果(因为原语类型“int”的默认值为0)。我选择发布“explicit”版本,因为我认为它更具教育意义。我没有提到任何构造函数方法。当然,他必须纠正这两种方法。