Создать ArrayList с фиксированной длиной Java
У меня возникла проблема. Когда я создаю ArrayList, используя конструктор, где указывается длина, размер ArrayList всегда равен нулю.
ArrayList<Integer> d = new ArrayList<>(si + 1);
.
Log.d("e", String.valueOf(d.size()));
Вывод:
0
.
Log.d("e", String.valueOf(si + 1));
Вывод:
1
Подскажите, как правильно создать такой массив.
Весь метод:
String[] sp = str.split(":");
int s = Integer.parseInt(sp[0]);
int f = Integer.parseInt(sp[1]);
boolean j = Boolean.parseBoolean(sp[2]);
if(j){
int si = Integer.parseInt(sp[3]);
ArrayList<Integer> d = new ArrayList<>(si + 1);
for(int i = 0; i < si; i++){
d.set(i, Integer.parseInt(sp[i + 4]));
}
return new Move(s, f, d);
}
return new Move(s, f);
Ответы (1 шт):
Когда я создаю
ArrayList, используя конструктор, где указывается длина, размерArrayListвсегда равен нулю.
В конструкторе ArrayList(int initialCapacity) задаётся НЕ размер, а ёмкость создаваемого списка, чтобы слегка оптимизировать заполнение списка заранее известным количеством элементов. Сам же список создаётся пустым:
public ArrayList(int initialCapacity)
Constructs an empty list with the specified initial capacity.
Создать ArrayList с фиксированной длиной
ArrayList - по определению является реализацией интерфейса List на базе расширяемого массива:
Resizable-array implementation of the
Listinterface.
Если задача состоит в том, чтобы создать список заданной длины, в который нельзя будет добавлять элементы, можно использовать метод Arrays.asList, для создания списка фиксированной длины, но для этого потребуется преобразовать массив строк в массив Integer при помощи Stream API, в частности получив поток "строк", начиная с нужного индекса при помощи Arrays.stream(T[] arr, int from, int to):
List<Integer> d = Arrays.asList(
Arrays.stream(sp, 4, 4 + si)
.map(Integer::parseInt)
.toArray(Integer[]::new)
);
Или же можно воспользоваться вариантами коллекторов Collectors.toUnmodifiableList() (Java 10+) или Stream.toList (Java 16+) или Collectors.collectingAndThen + Collections.unmodifiableList (Java 8+):
List<Integer> java10 = Arrays.stream(sp, 4, 4 + si)
.map(Integer::parseInt)
.collect(Collectors.toUnmodifiableList());
List<Integer> java16 = Arrays.stream(sp, 4, 4 + si)
.map(Integer::parseInt)
.toList();
List<Integer> java8 = Arrays.stream(sp, 4, 4 + si)
.map(Integer::parseInt)
.collect(Collectors.collectingAndThen(
Collectors.toList(), Collections::unmodifiableList
));