[英]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.