Как я могу вырезать 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.