如何在Java中将一个ArrayList<ArrayList<String>>转换为List<List<String>>?

3
我正在解决LeetCode上的N皇后问题,该问题规定主方法的返回类型为List<List<String>>。我想如果我创建一个全局变量作为List<List<String>>,然后在主方法中将其实例化为ArrayList<ArrayList<String>>,我就能够以正确的类型返回,但当我尝试实例化时,会出现错误:“第12行:错误:不兼容的类型:ArrayList<ArrayList<StringBuilder>>无法转换为ArrayList<ArrayList<String>>”。

我曾认为,因为ArrayList实现了List,所以可以将ArrayList的实例作为List返回,但是当我将全局变量设置为ArrayList时,它会给出以下错误:“第15行:错误:不兼容的类型:ArrayList<ArrayList<String>>无法转换为List<List<String>>”。打印出被视为有效的棋盘组合,我知道我得到了正确的组合,但是这个最后的细节真的让我很沮丧,我非常感谢任何关于为什么我会得到这些错误的解释。谢谢!

class Solution {
    ArrayList<Integer> colsUsed;
    ArrayList<Integer> leftDiagsUsed;
    ArrayList<Integer> rightDiagsUsed;
    ArrayList<ArrayList<String>> solutions;

    public List<List<String>> solveNQueens(int n) {
        colsUsed = new ArrayList<Integer>();
        leftDiagsUsed = new ArrayList<Integer>();
        rightDiagsUsed = new ArrayList<Integer>();
        ArrayList<StringBuilder> board = createBoard(n);
        solutions = new ArrayList<ArrayList<String>>();

        return solutions;
    }

        public void iterateBoards(ArrayList<StringBuilder> board, int row, int n){
        if (row >= n){
            printBoard(board);
            addBoard(board);
            return;
        }
        for (int col = 0; col < n; col++){
            if (!colsUsed.contains(col) && !leftDiagsUsed.contains(row - col) && !rightDiagsUsed.contains(row + col)){
                colsUsed.add(col);
                leftDiagsUsed.add(row - col);
                rightDiagsUsed.add(row + col);

                board.get(row).setCharAt(col, 'Q');
                iterateBoards(board, row + 1, n);

                colsUsed.remove(new Integer(col));
                leftDiagsUsed.remove(new Integer(row - col));
                rightDiagsUsed.remove(new Integer(row + col));
                board.get(row).setCharAt(col, '.');
            }
        }
    }

    public ArrayList<StringBuilder> createBoard(int n){
        StringBuilder row = new StringBuilder();
        ArrayList<StringBuilder> board = new ArrayList<StringBuilder>(n);
        for (int col = 0; col < n; col++){
            row.append(".");
        }
        for (int currRow = 0; currRow < n; currRow++){
            board.add(new StringBuilder(row.toString()));
        }
        return board;
    }

    public void addBoard(ArrayList<StringBuilder> board){
        List<String> newBoard = new ArrayList<String>();
        for (int i = 0; i < board.size(); i++){
            newBoard.add(board.get(i).toString());
        }
        solutions.add(newBoard);
    }

    public void printBoard(ArrayList<StringBuilder> board){
        for (int i = 0; i < board.size(); i++){
            StringBuilder curr = board.get(i);
            System.out.println(curr.toString());
        }
        System.out.println();
    }
}
1个回答

4

将所有变量声明改为仅使用List接口。在声明中使用最广泛的类型是一个好习惯 - 对于java.util集合而言,几乎总是使用接口。

选择使用ArrayList(而不是例如LinkedList)的事实是一个对代码其余部分没有影响的实现细节。

class Solution {
    List<Integer> colsUsed;
    List<Integer> leftDiagsUsed;
    List<Integer> rightDiagsUsed;
    List<List<String>> solutions;

    public List<List<String>> solveNQueens(int n) {
        // [...]
        solutions = new ArrayList<List<String>>();

解决方案也可以只用以下方式初始化:solutions = new ArrayList<>(); - jonD02

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接