簡體   English   中英

如何轉換ArrayList <ArrayList<String> &gt;列表 <List<String> &gt;在Java?

[英]How to convert an ArrayList<ArrayList<String>> to List<List<String>> in Java?

我正在研究LeetCode上的N-Queens問題,該問題規定main方法的返回類型是List<List<String>> 我想如果我創建了一個List<List<String>>的全局變量,那么在main實例化它作為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();
    }
}

將所有變量聲明更改為僅使用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>>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM