Как установить начальную емкость вложенных списков?

#java #java-8

#java #java-8

Вопрос:

Я пытаюсь установить начальную емкость вложенного ArrayList в некоторое значение (скажем, 10), но когда я попытался получить доступ к внутреннему списку, чтобы добавить какой-то элемент, который он мне выдает ArrayOutOfBoundException . Пожалуйста, предложите какое-нибудь хорошее решение!!!

Ниже приведен фрагмент кода

 public static void main(String[] args) 
{
    ArrayList<ArrayList<Integer>> bucket = new ArrayList<ArrayList<Integer>>();

    System.out.println(bucket.get(5).add(5));       

    System.out.println(bucket);
}
  

Комментарии:

1. Установка начальной емкости ничего не изменит. Вы не можете получить доступ к элементу списка, если индекс недействителен, независимо от емкости. Если вы хотите получить доступ к элементу с индексом 5, то размер списка должен быть не менее 6

2. Начальная емкость — это не фактический размер, а просто ограничение на количество выделяемого пространства.

3. @JBNizet Есть ли какой-нибудь выход???

4. ArrayList<ArrayList<Integer>> bucket = Stream.generate(ArrayList<Integer>::new) .limit(size).collect(Collectors.toCollection(ArrayList::new));

Ответ №1:

Код :

  public class Example {

    public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> bucket = new ArrayList<ArrayList<Integer>>();      

        //initial capacity of the nested arraylist to 5.  
        System.out.println(bucket.add(new ArrayList<>(5)));
        ArrayList<Integer> element = new ArrayList<>();
        element.add(5);
        bucket.add(0, element);
        System.out.println(bucket);
    }

}
  

Вывод :

 true
[[5], []]
  

Ответ №2:

 System.out.println(bucket.get(5).add(5));  
  

Вам нужно понять эту строку кода, вы пытаетесь получить доступ к пятому элементу из списка массивов «bucket», но добавили ли вы какие-либо элементы в корзину ArrayList (в вашем случае элемент является другим списком массива)

Пока вы не добавите свои элементы, вы не сможете получить к ним доступ, поскольку они не существуют, следовательно, вы видите ArrayOutOfBoundException , когда пытаетесь получить доступ к 5-му элементу по адресу bucket.get(5)

возможно, вы захотите использовать javadoc ArrayListhttps://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html

Комментарии:

1. Есть ли какой-либо способ, с помощью которого я могу инициализировать переменную «bucket» с «N» пустым Arraylist, как тот, который я попробовал в этом случае….

Ответ №3:

Начиная с Java 8, вы можете сгенерировать список пустых списков с помощью Stream.generate .

 import java.util.*;
import java.util.stream.*;

public class ListOfLists {
    public static void main(String[] args) {
        List<List<Integer>> bucket = listOfList(10);
        bucket.get(5).add(5);
        System.out.println(bucket);
    }

    public static <T> List<List<T>> listOfList(int size) {
        return Stream.generate(ArrayList<T>::new).limit(size).collect(Collectors.toList());
    }
}
  

Вывод

 [[], [], [], [], [], [5], [], [], [], []]