Как вытолкать объекты от набора в Java?

Есть ли метод в 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;
}
9
задан Tom Brito 8 June 2010 в 15:36
поделиться

4 ответа

Если вы ищете структуру, подобную стеку, я предлагаю принять 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);

Если ваша основная мысль заключается в том, что вам нужно точно знать , какие элементы были фактически обнаружены, я думаю вы застряли со своим исходным кодом.

11
ответ дан 4 December 2019 в 13:45
поделиться

Думаю, нет, потому что ваше определение операции 'pop' очень нестандартно. Обычно она не принимает никаких аргументов (кроме самой коллекции), возвращает и удаляет самый верхний.

Но раз вы отметили apache commons, то это даст тот же эффект, что и ваш код.

Collection result = CollectionUtils.intersection(a, b);
a.removeAll(b);

edit
http://commons.apache.org/collections/api-release/index.html

1
ответ дан 4 December 2019 в 13:45
поделиться

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

Некоторые предложения:

  • Рассмотрите возможность использования removeAll(object) вместо remove(object), если elements - произвольная коллекция, поскольку вам может понадобиться удалить дубликаты, например, если elements - список.

  • contains() медленна для некоторых типов коллекций (например, списков), так как ей нужно обойти всю структуру данных. Учитывая, что это происходит во внутреннем цикле, вы рискуете получить проблемы с производительностью O(n^2). Если вы можете заставить алгоритм работать с HashSet или HashMap, тогда contains() будет O(1) и ваш алгоритм будет намного эффективнее.

0
ответ дан 4 December 2019 в 13:45
поделиться

В стандартных методах, предоставляемых JDK, такого метода нет. Apache Commons предоставляет метод ListUtils.subtract () .

Изменить: как отметили другие респонденты, вы используете термин pop нестандартно. Обычно

операция pop удаляет элемент из вершины [стека]

В Википедии есть хорошее описание стека .

2
ответ дан 4 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: