固定大小列表

问题描述 投票:0回答:1

如何创建固定大小的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 list arraylist
1个回答
0
投票

我认为你真的不需要

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.