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

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. Однако:

  1. было бы много работы для проектирования, реализации и тестирования.
  2. теперь вы добавили значительный новый класс в свою базу кода, возможно, с зависимостями от недокументированных аспектов (и, следовательно, "подлежащих изменению") аспектов ArrayList класса.
  3. вам нужно изменить соответствующие места в коде, где вы создаете ArrayList экземпляры для создания экземпляров вашего подкласса вместо этого.

"копировать такие" решения является более практичным ... имея в виду, что это не истинные срезы.

если нет существующего метода, то вы можете перебирать от 0 до input.size()/2, принимая каждый последовательный элемент и добавляя его в новый ArrayList.

EDIT: на самом деле, я думаю, что вы можете взять этот список и использовать его для создания нового ArrayList с помощью один из конструкторов ArrayList.

Я нашел способ, если вы знаете startIndex и endIndex элементов, которые нужно удалить из ArrayList

пусть al быть оригинальным ArrayList и startIndex,endIndex быть начальным и конечным индексом, который будет удален из массива соответственно:

al.subList(startIndex, endIndex + 1).clear();

вот как я это решил. Я забыл, что подсписок был прямой ссылкой на элементы в исходном списке, поэтому имеет смысл, почему это не сработает.

ArrayList inputA = новый ArrayList(input.подсписок(0, ввод.размер()/2));