在java中加载2d数组的所有值
我正在尝试创建一个2d益智滑块游戏。我创建了自己的名为gamestate的对象来存储父gamestate和新gamestate,因为我计划使用BFS解决它。示例数组如下所示在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;
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”版本,因为我认为它更具教育意义。我没有提到任何构造函数方法。当然,他必须纠正这两种方法。