Удалить все экземпляры элемента из коллекции

#java #object #collections #recursion

#java #объект #Коллекции #рекурсия

Вопрос:

Мне нужно удалить все элементы из коллекции c, которые меньше заданного объекта.

Подпись должна быть void removeLess(Collection c, Object o)

Сработает ли что-то подобное этому?:

 void removeLess(Collection c, Object o) {
    Iterator<Integer> itr = c.iterator();
    while (itr.hasNext()) {
        if (itr.next.compareTo(o) < 0) {
            c.remove(o);
        }
    }
}
  

Комментарии:

1. «Сработало бы что-то подобное?» Почему бы не попробовать это?

2. ответы объясняют, почему это не сработает, но также я не думаю, что o это действительно то, что вы имеете в виду под удалением в любом случае.

3. и o должно быть Integer , чтобы это сработало. В следующем выпуске Guava вы могли бы сделать все это как просто Iterables.removeIf(c, Ranges.lessThan(o)) .

Ответ №1:

Вы не можете использовать c.remove(o) или делаете недействительным итератор; но вы можете использовать необязательный метод Iterator.remove() , как в itr.remove() . Он удаляет последний объект, возвращенный из «next».

Ответ №2:

Похоже, что так и будет, при условии, что Collection класс Iterator поддерживает remove метод.

И у вас синтаксическая ошибка — должно быть itr.next() .

Кроме того, попробуйте это?

Комментарии:

1. Он не вызывает itr.remove(), он вызывает c.remove(o).

2. Да, только что заметил это. В коде есть несколько ошибок.

Ответ №3:

Нет, это не сработает, поскольку вы не можете изменять коллекцию, пока над ней есть Iterator . Вы должны накапливать элементы, которые вы будете удалять, в другую временную коллекцию и удалять их все впоследствии.

Лучшим подходом, если вас не волнуют индексы, в которых находится элемент, было бы использовать TreeSet<T> класс, который по структуре предоставляет метод, tailSet(T element) который делает именно то, что вам нужно.

Ответ №4:

Вместо этого вам пришлось бы использовать метод Iterator ‘s remove , а подпись должна быть:

 <E extends Comparable<? super E>> void removeLess(Collection<E> c, E o)
  

С NavigableSet<E> таким TreeSet , как a, вы могли бы просто сделать:

 set.headSet(o).clear();