Как получить фрагмент массива ArrayList
в Java? В частности, я хочу сделать что-то вроде этого:
ArrayList<Integer> inputA = input.subList(0, input.size()/2);
// where 'input' is a prepouplated ArrayList<Integer>
Итак, я ожидал, что это сработает, но Java возвращает List
- так что это несовместимо. И когда я пытаюсь его закинуть, Java не позволяет. Мне нужен ArrayList
- что я могу сделать?
ArrayList
? Я думаю , что вы , возможно , не хватает немного понимания того, как интерфейсы работают , потому чтоList
иArrayList
не являются «несовместимыми» -ArrayList
орудияList
, и ,List
вероятно , содержит все необходимые методы вам нужно.ArrayList
потому что затем ему нужно вызвать с ним метод, который принимаетArrayList
. Возможно, такой метод плохо спроектирован и должен быть принятList
вместо него, но такие ситуации могут возникать не только в вопросах интервью, но и в коде, написанном другими, который нельзя просто пойти и изменить. Коллеги и библиотеки не всегда идеальны.Ответы:
В 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
экземпляры, чтобы вместо этого создать экземпляры вашего подкласса.Решение «скопировать массив» более практично ... учитывая, что это не настоящие срезы.
источник
new ArrayList(input.subList(0, input.size()/2))
Я нашел способ, если вы знаете startIndex и endIndex элементов, которые нужно удалить из ArrayList
Позвольте
al
быть исходным ArrayList иstartIndex
,endIndex
быть начальным и конечным индексами, которые будут удалены из массива соответственно:al.subList(startIndex, endIndex + 1).clear();
источник
Если нет существующего метода, я думаю, вы можете выполнить итерацию от 0 до
input.size()/2
, беря каждый последовательный элемент и добавляя его в новый список ArrayList.РЕДАКТИРОВАТЬ : На самом деле, я думаю, вы можете взять этот список и использовать его для создания экземпляра нового ArrayList с помощью одного из конструкторов ArrayList .
источник
Хотя этот пост очень старый. На случай, если кто-то это ищет ..
Guava упрощает разделение списка на подсписки указанного размера.
List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8); List<List<Integer>> subSets = Lists.partition(intList, 3);
источник
Вот как я это решил. Я забыл, что подсписок был прямой ссылкой на элементы в исходном списке, поэтому понятно, почему это не сработало.
ArrayList<Integer> inputA = new ArrayList<Integer>(input.subList(0, input.size()/2));
источник