好的,所以我应该实现一个包含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++];
}
}
谢谢!
答案 0 :(得分:1)
你需要在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;
}
答案 1 :(得分:0)
Set
的实施应该保证不重复而不是Iterator
。
也就是说,您的Set.add()
及其构造函数与Collection as参数应该保证不重复。
迭代器只实现hasNext()
,next()
和remove()
。
如果Iterator
负责复制检查,则您的设置将违反java.util.Set
合同。此外,迭代器将承担两个责任 - 检查重复和遍历,这违反了“单一责任原则”。
答案 2 :(得分:0)
是的,我只是想要一个关于如何使用该迭代器而不是for循环或while循环的示例。
你几乎必须使用某种循环才能使用Iterator
。这是基本模式:
Iterator it = ... // instantiate the iterator
while (it.hasNext()) {
Object obj = it.next();
... // do something with obj
}
如果集合对象(例如您的对象集)实现Iterable
,那么您可以使用新的for
循环语法; e.g。
for (Object obj : yourSet) {
... // do something with obj
}
当然,还有其他方法来表达这一点,但是它们 all 涉及(某处)某种循环以从迭代器中提取对象。