Какой метод в интерфейсе Iterator может удалить ранее возвращенный элемент? - PullRequest
3 голосов
/ 01 октября 2011

Я прочитал следующее в Структурах данных и Алгоритмах от Goodrich:

Java предоставляет итератор через интерфейс java.util.Iterator.Отметим, что класс java.util.Scanner (раздел 1.6) реализует этот интерфейс.Этот интерфейс поддерживает дополнительный (необязательный) метод для удаления ранее возвращенного элемента из коллекции.Однако эта функциональность (удаление элементов с помощью итератора) несколько противоречива с точки зрения объектно-ориентированного подхода, и неудивительно, что ее реализация классами является необязательнойимеет в виду здесь.Какой метод обсуждается здесь и что он делает?

Ответы [ 6 ]

3 голосов
/ 01 октября 2011

Iterator.remove () , который удаляет последний узел, возвращенный вызовом next () или previous () (если это ListIterator )

2 голосов
/ 01 октября 2011

В интерфейсе Iterator есть функция remove(), которая может быть реализована по желанию. Документы говорят:

Удаляет из базовой коллекции последний элемент, возвращаемый итератором (необязательная операция). Этот метод может быть вызван только один раз за каждый следующий вызов. Поведение итератора не определено, если базовая коллекция изменена во время выполнения итерации любым способом, кроме вызова этого метода.

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

1 голос
/ 01 октября 2011
public interface Iterator
{

    public abstract boolean hasNext();

    public abstract Object next();

    public abstract void remove();
}

Метод remove () является необязательным и удаляет последний элемент, возвращаемый функцией next () из коллекции.

1 голос
/ 01 октября 2011

Рассматриваемый метод - Iterator.remove (), который является частью интерфейса Iterator .

Многие экземпляры Iterator не поддерживают его - если вы попытаетесь вызвать его на неправильном виде итератора, вы, скорее всего, получите исключение UnsupportedOperationException .

Лично я не думаю, что remove () - это очень хорошая идея как часть интерфейса Iterator: основная концептуальная цель Iterator состоит в том, чтобы сделать один проход по элементам коллекции и вернуть эти элементы в последовательности.

Если вы следуете школе «делай хорошо», то будет плохой идеей использовать итераторы в качестве метода для модификации таких коллекций. Такое поведение также может вызвать большие головные боли с точки зрения параллелизма ....

1 голос
/ 01 октября 2011

Вероятно, метод Iterator.remove () .

0 голосов
/ 01 октября 2011

Метод remove() удаляет элемент, который был недавно возвращен из next().

...