#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();