2015-08-26 5 views
-3

Я создал список, содержащий списки целых чисел. Я понял вопрос, потому что мой recipe (внешний список) пуст.Получение списка из ArrayList throwing IndexOutOfBoundsException

Мой код:

 Scanner sc = new Scanner(System.in); 
     int t = sc.nextInt(); // t=4 
     List<List<Integer>> recipe = new ArrayList<List<Integer>>(t+1); 
     for(int i=1 ; i<t+1 ; i++){ 
      for (int l = 1; l <= 4; l++) { 
       recipe.get(l).add(i); 
      } 
     } 

Чтобы исправить это, все, что я могу думать, это,

for(int i= 0; i<t+1 ;i++){ 
    recipe.add(new ArrayList<Integer>()); 
} 

Есть ли лучший способ сделать это?

Как и при создании Array, вы можете позвонить по любому индексу.

+0

«Я понял, проблема, потому что мой рецепт (внешний список) пуст ». Какая проблема? – vefthym

+0

'recipe.get (l)' строка 6 в коде вызывает ошибку IndexOutOfBounds. – Charan

+1

«Как вы думаете, новый ArrayList (размер)' делает »-« То же, что «массив» делает «нет», массивы заполняются элементами по умолчанию: '0'' false' 'null', но в случае коллекций вы устанавливают начальную емкость своей внутренней структуры, а не размер сбора. 'recipe.add (новый ArrayList ());' является правильным решением для вашей проблемы. – Pshemo

ответ

1

С кодом достаточно проблем.

Во-первых, конструктор int в ArrayList определяет только начальную емкость.

Он не инициализирует свои элементы.

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

Наконец, ваша ссылка является 1-индексированной, а в обоих массивах и коллекциях она должна быть проиндексирована 0.

Вот исправленная версия вашего кода.

int t = 4; // bypassing the Scanner here 
// initialize outer list with initial capacity 5 
List<List<Integer>> recipe = new ArrayList<List<Integer>>(t+1); 
for(int i=1 ; i<t+1 ; i++){ 
    // initializes inner list 
    recipe.add(new ArrayList<Integer>()); 
    // careful, you're using a different control variable to access the list elements 
    for (int l = 1; l <= 4; l++) {  
     // collections are 0-indexed, hence l - 1 
     recipe.get(l - 1).add(i); 
    } 
} 
+0

Добавление нового внутреннего массива ArrayList в каждой итерации внутреннего цикла не имеет смысла. Вы бы добавили t * 4 inner 'ArrayList' в список' recipe' и только добавили данные в первые 4 из них. – Eran

+0

@ Эран упс. Ты прав. Закрепление. – Mena

1

new ArrayList<List<Integer>>(t+1) создает пустую ArrayList с начальной загрузкой t+1. Вы должны добавить элемент в список, прежде чем вы сможете получить к нему доступ.

Кроме того, индексы списка основаны на 0.

for(int i=0 ; i<t ; i++){ 
     recipe.add(new ArrayList<Integer>()); 
     for (int l = 0; l < 4; l++) { 
      recipe.get(i).add(l); 
     } 
    } 
0

Если внутренняя итерация является постоянной (т.е. 4 в вашем примере), вы можете напрямую назначить его как

int t=4; 
List<List<Integer>> recipe = new ArrayList<List<Integer>>(t+1); 
for(int i=0; i<t; i++){ 
    recipe.add(new ArrayList<Integer>(Arrays.asList(new Integer[] {1,2,3,4}))); 
} 

Java 8

int t=4; 
List<List<Integer>> java8Recipie = IntStream.range(0, t) 
       .mapToObj(i -> IntStream.range(1, t+1).boxed().collect(Collectors.toList())) 
       .collect(Collectors.toList()); 
Смежные вопросы