Как преобразовать ArrayList<ArrayList <String >> в список<List <String >> в Java?
Я работаю над проблемой N-Queens для LeetCode, которая предусматривает, что тип возвращаемого значения для основного метода - это List>. Я думал, что если бы я создал глобальную переменную, которая представляла собой List>, а затем в main создал его как ArrayList>, я мог бы вернуться как правильный тип, но когда я пытаюсь создать экземпляр, он выдает ошибку: "Строка 12: ошибка: несовместимые типы: ArrayList> не может быть преобразован в ArrayList>". У меня также сложилось впечатление, что, поскольку ArrayList реализует List, вы можете вернуть экземпляр ArrayList в виде List, но когда я делаю глобальную переменную ArrayList, выдается следующая ошибка: "Строка 15: error: несовместимые типы: ArrayList > не может быть преобразован в список> ". Распечатывая доски, которые считаются действительными, я знаю, что получаю правильные комбинации, но эта последняя деталь действительно расстроила меня, и я был бы очень признателен за любое объяснение, почему я получаю эти ошибки. Спасибо!
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 ответ
Измените все объявления переменных, чтобы использовать только 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>>();