Загрузка всех значений 2d массива в Java - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь создать двухмерную головоломку-слайдер.Я создал свой собственный объект, называемый gamestate, для хранения родительского игрового состояния и нового игрового состояния, поскольку я планирую решить его с помощью BFS.Образец массива будет выглядеть как

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

Что означает

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

Для храненияВ этом состоянии я использовал следующее для цикла, который приносит indexOutOfBounds exceptions.

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;
}

Есть идеи, как это исправить?

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Проблема в части инициализации.

this.state = new int[0][0];

Этот код создаст нулевого размера двумерный массив.Вот почему вы получаете исключения indexOutOfBounds при попытке установить в нем значения.

Если вы хотите инициализировать массив с нулями, правильный синтаксис:

this.state = {{0,0,0},{0,0,0},{0,0,0}};

см. Официальную документацию дляполная ссылка: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

0 голосов
/ 02 октября 2018

В третьем конструкторе вы инициализируете this.state пустым массивом.Он не имеет элементов и, следовательно, имеет длину 0.Использование цикла for для доступа к любому элементу этого массива повышает ArrayIndexOutOfBoundsException.

Поскольку вы передаете state в качестве параметра, вы, вероятно, захотите скопировать его значения в поле state.

Вы можете сделать это так:

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;
}

Конечно, вы можете вызвать Arrays.of(state), но это не вернет глубокую копию state.Для каждого i у вас будет this.state[i] == state[i].


Дополнительная информация: Как скопировать 2-мерный массив в Java?

0 голосов
/ 02 октября 2018
  • Для конструктора GameState() (конструктор по умолчанию):

Измените state = new int[0][0]; на следующее: state = new int[3][3];.Таким образом, вы инициализируете массив с емкостью (3) x (3) элементов.

  • Для конструктора GameState(int[][] state, GameState parent):

Измените this.state = new int[0][0]; на this.state = new int[state.length] [state.length > 0 ? state[0].length : 0];

Таким образом, вы инициализируете массив с емкостью для

(state.length) x (state[0].length или 0, если state.length равно 0) элементов.

Также необходимо выполнить цикл до state.length с i и до state[i].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;
}

Кроме того, в качестве примечания, это не [1, 5, 2, 3, 4, 0, 6, 8, 7],

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

...