Как я могу вырезать ArrayList из ArrayList в Java?
как мне получить фрагмент массива ArrayList
в Java? Конкретно я хочу сделать что-то вроде этого:
ArrayList<Integer> inputA = input.subList(0, input.size()/2);
// where 'input' is a prepouplated ArrayList<Integer>
поэтому я ожидал, что это сработает, но Java возвращает List
- Так что это несовместимо. И когда я пытаюсь бросить его, Java не позволит мне. Мне нужен ArrayList
- что я могу сделать?
4 ответа:
в Java рекомендуется использовать типы интерфейса, а не конкретные классы в API.
ваша проблема в том, что вы используете
ArrayList
(вероятно, во многих местах), где вы действительно должны использоватьList
. В результате вы создали проблемы для себя с ненужным ограничением, что список являетсяArrayList
.вот как должен выглядеть ваш код:
List input = new ArrayList(...); public void doSomething(List input) { List inputA = input.subList(0, input.size()/2); ... } this.doSomething(input);
ваше предлагаемое "решение" проблемы было/есть это:
new ArrayList(input.subList(0, input.size()/2))
это работает, делая копию подсписка. Это не кусочек в обычном смысле. Кроме того, если список большой, то создание копии будет дорого.
если вы ограничены API, что вы не могу изменить такие, что вы обязательно объявить
inputA
какArrayList
, возможно, вы сможете реализовать пользовательский подклассArrayList
, в которомsubList
метод возвращает подклассArrayList
. Однако:
- было бы много работы для проектирования, реализации и тестирования.
- теперь вы добавили значительный новый класс в свою базу кода, возможно, с зависимостями от недокументированных аспектов (и, следовательно, "подлежащих изменению") аспектов
ArrayList
класса.- вам нужно изменить соответствующие места в коде, где вы создаете
ArrayList
экземпляры для создания экземпляров вашего подкласса вместо этого."копировать такие" решения является более практичным ... имея в виду, что это не истинные срезы.
если нет существующего метода, то вы можете перебирать от 0 до
input.size()/2
, принимая каждый последовательный элемент и добавляя его в новый ArrayList.EDIT: на самом деле, я думаю, что вы можете взять этот список и использовать его для создания нового ArrayList с помощью один из конструкторов ArrayList.