Как вы код Iterator
для Set
? Учитывая, что итератор не имеет доступа к основному механизму хранения данных и может использовать только методы Set
, можно ли это сделать?Реализация итератора для набора, отслеживание текущего элемента
Каждая реализация, которую мне удалось найти, создает Iterator
как анонимный класс; Тем не менее, я пытаюсь выяснить, есть ли умный способ перебора более Set
, а только доступ к методам, предоставленным Set
.
До сих пор лучшее, что я смог придумать выглядит следующим образом:
import java.util.*;
public class SetIterator<E> implements Iterator
{
protected E[] arrayData;
protected Set<E> set;
protected int index;
protected boolean canRemove;
public SetIterator(Set<E> set)
{
this.set = set;
this.arrayData = (E[]) set.toArray();
this.index = -1;
this.canRemove = false;
}
public E next()
{
if(this.hasNext())
{
this.canRemove = true;
return this.arrayData[++this.index];
}
else
{
throw new NoSuchElementException("There is no next element");
}
}
public boolean hasNext()
{
return this.index + 1 < this.arrayData.length;
}
public void remove()
{
if(this.canRemove)
{
this.set.remove(this.arrayData[index--]);
this.arrayData = (E[]) this.set.toArray();
this.canRemove = false;
}
else
{
throw new IllegalStateException("Cannot remove element before calling next");
}
}
}
Но что чувствует себя довольно запутано .... есть лучший способ?
Возможно, я что-то пропустил, но разве ваш итератор не является обертой вокруг Итерабельного? Зачем вам это нужно, а не просто использовать Set напрямую? –
Я смущен. Вам интересно, зачем мне нужен итератор? Что вы подразумеваете под прямым набором? – MirroredFate
'Set' реализует' Collection', который (в свою очередь) реализует 'Iterable' с обязательным [' iterator'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Iterable. html # iterator()). –