如何创建固定大小的List实例(不能对它们执行add()操作,但可以执行set()操作)?当我尝试将
fields.set(i, board.get(i).get(x));
更改为 fields.add(new SudokuField());
时,我在 IntelliJ 中没有收到编译器错误。
import java.util.*;
public class SudokuBoard {
private final List<List<SudokuField>> board = new ArrayList<>();
private final SudokuSolver solver;
//private final List<ComponentObserver> observers = Arrays.asList(new ComponentObserver[3]);
private final ComponentObserver[] observers = new ComponentObserver[3];
private boolean state = true;
public SudokuBoard(SudokuSolver solver) {
this.solver = Objects.requireNonNull(solver);
for (int i = 0; i < 9; i++) {
List<SudokuField> row = Arrays.asList(new SudokuField[9]);
for (int j = 0; j < 9; j++) {
row.set(j, new SudokuField());
}
board.add(row);
}
for (int i = 0; i < 3; i++) {
observers[i] = new ComponentObserver();
}
}
public void solveGame() {
solver.solve(this);
}
public boolean isSafe() {
return checkBoard();
}
public int get(int y, int x) {
return board.get(y).get(x).getFieldValue();
}
private void setState() {
state = observers[0].getCorrectState();
state &= observers[1].getCorrectState();
state &= observers[2].getCorrectState();
}
private void update(int y, int x) {
observers[0].update(getRow(y));
observers[1].update(getColumn(x));
observers[2].update(getBox(y, x));
}
public void set(int y, int x, int value) {
board.get(y).get(x).setFieldValue(value);
update(y, x);
setState();
}
public SudokuRow getRow(int y) {
List<SudokuField> fields = Arrays.asList(new SudokuField[9]);
for (int i = 0; i < 9; i++) {
fields.set(i, board.get(y).get(i));
}
return new SudokuRow(fields);
}
public SudokuColumn getColumn(int x) {
List<SudokuField> fields = Arrays.asList(new SudokuField[9]);
for (int i = 0; i < 9; i++) {
fields.set(i, board.get(i).get(x));
}
return new SudokuColumn(fields);
}
public SudokuBox getBox(int y, int x) {
List<SudokuField> fields = Arrays.asList(new SudokuField[9]);
int row = y / 3 * 3;
int col = x / 3 * 3;
int index = 0;
for (int i = row; i < row + 3; i++) {
for (int j = col; j < col + 3; j++) {
fields.set(index, board.get(i).get(j));
index++;
}
}
return new SudokuBox(fields);
}
private boolean checkBoard() {
return state;
}
}
我认为你真的不需要
java.util.List
。你可以只使用普通数组!
public class Test {
SudokuField[][] board = new int[size_1][size_2];
public void get() {
System.out.println(board[x][y]);
}
public void set() {
board[x][y] = value;
}
}