Есть ли метод в JDK или апачском свободном городском населении для "выталкивания" списка элементов от java.util. Список? Я имею в виду, удаляю список элементов и возвращаю его, как этот метод:
public Collection pop(Collection elementsToPop, Collection elements) {
Collection popped = new ArrayList();
for (Object object : elementsToPop) {
if (elements.contains(object)) {
elements.remove(object);
popped.add(object);
}
}
return popped;
}
Если вы ищете структуру, подобную стеку, я предлагаю принять Deque
( LinkedList
- наиболее распространенная реализация) вместо Сборник
.
Если вам на самом деле не нужно рассматривать его как стек, просто возьмите итератор из Collection
и используйте метод remove ()
:
for (Iterator<SomeType> it = elements.iterator(); it.hasNext(); ) {
SomeType e = it.next();
it.remove();
popped.add(e);
}
Обратите внимание, что remove - необязательная операция, и некоторые реализации могут вызывать исключение UnsupportedOperationException
(например, итератор, возвращенный Collection из Collections.unmodifiable ... ()
, будет).
Правка : после более внимательного изучения вашего вопроса, я думаю, вам просто нужно это:
elements.removeAll(elementsToRemove);
Если ваша основная мысль заключается в том, что вам нужно точно знать , какие элементы были фактически обнаружены, я думаю вы застряли со своим исходным кодом.
Думаю, нет, потому что ваше определение операции 'pop' очень нестандартно. Обычно она не принимает никаких аргументов (кроме самой коллекции), возвращает и удаляет самый верхний.
Но раз вы отметили apache commons, то это даст тот же эффект, что и ваш код.
Collection result = CollectionUtils.intersection(a, b);
a.removeAll(b);
edit
http://commons.apache.org/collections/api-release/index.html
Здесь нет метода, в точности похожего на то, что вы просите, но похоже, что вы уже довольно близки к этому с вашим кодом.
Некоторые предложения:
Рассмотрите возможность использования removeAll(object) вместо remove(object), если elements - произвольная коллекция, поскольку вам может понадобиться удалить дубликаты, например, если elements - список.
contains() медленна для некоторых типов коллекций (например, списков), так как ей нужно обойти всю структуру данных. Учитывая, что это происходит во внутреннем цикле, вы рискуете получить проблемы с производительностью O(n^2). Если вы можете заставить алгоритм работать с HashSet или HashMap, тогда contains() будет O(1) и ваш алгоритм будет намного эффективнее.
В стандартных методах, предоставляемых JDK, такого метода нет. Apache Commons предоставляет метод ListUtils.subtract ()
.
Изменить: как отметили другие респонденты, вы используете термин pop
нестандартно. Обычно
операция pop удаляет элемент из вершины [стека]
В Википедии есть хорошее описание стека .