Используя итератор для набора типа объекта? - PullRequest
0 голосов
/ 27 января 2011

Хорошо, поэтому я должен реализовать набор, который содержит элементы типа Object без дубликатов , что означает, что мне нужно сравнить каждый новый элемент с предыдущими элементами в наборе.Набор имеет свой собственный класс и метод для вставки нового элемента.

Мой вопрос: как использовать итератор, который я написал ниже, для сравнения всех записей в наборе с предлагаемым элементом для добавления?

class SetIterator implements MyIterator {
    private ArraySet arr;  //ArraySet is the name of the Set class
    private int n;

    SetIterator(ArraySet myArraySet)
    {
        arr = myArraySet;
        n = 0;
    }

    @Override
    public boolean hasNext() 
    {
        return (n <= arr.size());
    }

    @Override
    public Object next()
    {
        if (hasNext())
            return arr[n++];
    }   
}

Спасибо!

Ответы [ 3 ]

1 голос
/ 27 января 2011

Вам нужно что-то вроде этого в ArraySet.java.

public Iterator iterator()
{
    return new SetIterator(this);
}

public boolean add(Object o)
{
    for (Object item : this)
        if (o.equals(next)) return false;
    }
    // add code to put o in the array
    return true;
}

Цикл for переводится компилятором примерно так:

Iterator it = this.iterator();
while (it.hasNext())
{
    Object item = it.next();
    if (o.equals(next)) return false;
}
0 голосов
/ 27 января 2011

Да, я просто хочу получить пример того, как использовать этот итератор вместо цикла for или цикла while.

В значительной степени вы должны использовать какой-то цикл, чтобы использоватьIterator.Вот базовый шаблон:

Iterator it = ... // instantiate the iterator
while (it.hasNext()) {
    Object obj = it.next();
    ... // do something with obj
}

Если объект коллекции (например, ваш набор объектов) реализует Iterable, тогда вы можете использовать новый синтаксис цикла for;например,

for (Object obj : yourSet) {
    ... // do something with obj
}

Конечно, есть и другие способы выразить это, но они все включают (где-то) цикл некоторого вида для извлечения объектов из итератора.

0 голосов
/ 27 января 2011

Реализация Set должна гарантировать отсутствие дублирования, а не Iterator.

То есть ваш Set.add() и его конструктор с аргументом Collection в качестве аргумента должны гарантировать отсутствие дублирования. Итератор просто реализует hasNext(), next() и remove().

Если Iterator позаботится о проверке дубликатов, ваш Набор нарушит java.util.Set контракт. Более того, Итератор возьмет на себя две обязанности - проверять дублирование и обход, что нарушает «Единый принцип ответственности» * 1013

...