2013-10-15 7 views
3

Это кажется действительно тривиальным, но мне трудно копировать 2D String ArrayList во всю новую структуру данных 2D String ArrayList.Копирование 2D String ArrayList

public static ArrayList<ArrayList<String>> copy(ArrayList<ArrayList<String>> input) { 

    ArrayList<ArrayList<String>> copy = new ArrayList<ArrayList<String>>(); 

    for(int i = 0; i < input.size(); i++) { 
     ArrayList<String> line = input.get(i); // Issue here? 
     for(int j = 0; j < input.get(i).size(); j++) { 
      line.set(j, input.get(i).get(j)); 
     } 
    } 
    return copy; 
} 

Я не ищу, чтобы сделать неполную копию, я пытаюсь перебрать всю ArrayList и скопировать его в новую. Я чувствую, что я не инициализирую строки правильно с моей линией ArrayList, но я думал, что вся суть структуры данных ArrayList заключается в том, что данные могут быть добавлены к ней без инициализации размера?

Похоже, что первая строка копируется правильно, но я индексируюсь за пределы, когда пытаюсь добавить следующую строку.

+0

'ArrayList > копия = новый ArrayList <> (вход);' ?? – MadProgrammer

+0

Почему у вас есть внутренний цикл? Я думаю, вы можете просто использовать для (int i = 0; i

+0

@Thuiya, который не будет копировать 'ArrayList', это Java, а не C++. – Vallentin

ответ

2
public static ArrayList<ArrayList<String>> copy(ArrayList<ArrayList<String>> input) { 
    ArrayList<ArrayList<String>> copy = new ArrayList<ArrayList<String>>(input.size()); 
    for(int i = 0; i < input.size(); i++) { 
     ArrayList<String> line = input.get(i); 
     copy.set(i, new ArrayList<String>(line.size())); // add internal array initialization 
     for(int j = 0; j < line.size(); j++) { 
      copy.get(i).set(j, line.get(j)); // actually copy value into new array 
     } 
    } 
    return copy; 
} 
+0

Спасибо за пояснения! – JAL

+0

Получение ошибки за пределами этой строки (так же, как и в другом решении): 'copy.set (i, new ArrayList (line.size()));' Любая идея, почему строки не добавляются в ArrayList должным образом? – JAL

+1

@JAL change 'set (i' и' set (j' to 'add (' –

2

Вы забыли создать ArrayList внутри самого ArrayList.

public static ArrayList<ArrayList<String>> copy(ArrayList<ArrayList<String>> input) { 

    ArrayList<ArrayList<String>> copy = new ArrayList<ArrayList<String>>(); 

    for(int i = 0; i < input.size(); i++) { 
     ArrayList<String> line = new ArrayList<String>(); 

     for(int j = 0; j < input.get(i).size(); j++) { 
      line.add(input.get(i).get(j)); 
     } 

     copy.add(line); 
    } 
    return copy; 
} 
+0

Оцените ответ. Благодаря! – JAL

+0

Все еще получает индекс IndexOutOfBoundsException: 0, размер: 0 на этой строке line.set (j, input.get (i) .get (j)); Любая идея, что может быть неправильным? Если я печатаю значение input.get (i) .get (j), я получаю допустимый символ, но он не добавляется в ArrayList правильно – JAL

+1

Я отредактировал свой ответ. – Vallentin

Смежные вопросы