获取java类,我们必须设计自己的HashSet类。 (不使用JAVA apis)
我必须为此实现和迭代,我对使用它的语义感到困惑。
不确定是否应该允许调用Next()来调用迭代器的索引,或者用户是否必须绝对使用next()和hasNext()循环来移动索引
例如,如果用户连续多次调用next()而没有hasNext(),会发生什么?
感谢大家的帮助!
public class HashWordSet implements WordSet {
private int size;
private Node[] buckets = new Node[8];
//above is only provided for mention of variables
private class Node {
Word value;
Node next = null;
public Node(Word word) {value = word;}
public String toString() {return value.toString();}
}
class WordIterator implements Iterator<Word> {
private Node next;
private int index = 0;
public Word next() {
Node element = next;
if (element == null)
throw new NoSuchElementException();
if ((next = element.next) == null) {
Node[] temp = buckets;
while (index < temp.length && (next = temp[index++]) == null)
;
}
return element.value;
}
public boolean hasNext() {
return (next != null);
}
答案 0 :(得分:3)
Javadoc指定如果调用next
并且没有下一个元素,则必须抛出NoSuchElementException
。也就是说,你不应该假设在hasNext
之前总是调用next
- 或者只调用hasNext
一次!
对哈希表执行此操作的典型方法是
hasNext
在哈希表中前进,如果它尚未指向有效元素。next
调用hasNext
作为其第一步,在完成返回下一个元素之后,递增到哈希表中的下一个位置(不检查该位置是否有元素) )。答案 1 :(得分:1)
只需按照此处显示的API http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Iterator.html
即可如果用户调用next()并且没有其他元素,则抛出NoSuchElementException。
答案 2 :(得分:0)
你绝对应该只能通过调用next()
来使用迭代器,假设它处于有效状态,你可以这样做。在每次迭代中检查hasNext()
是执行任务的惯用方法,但这不是必需的,您不应该依赖调用者这样做。
实际上,hasNext()
应该是幂等的,基本上不应该改变迭代器的任何状态。由于它不会改变状态,因此根据定义,无论以前是否调用它都不会有所不同。
所以基本上是的 - 每次调用next()
时,你应该返回迭代器的“当前”元素,然后推进“指针”(对于那些概念在你的实现中的意思)。
如果用户连续多次调用next()而没有hasNext()?
会发生什么情况
如果剩下足够的元素进行迭代,他会在每次调用next()
时返回连续的元素。如果他认为他知道更好,并在到达迭代器结束后调用next()
(即当hasNext()
返回false时),那么根据Javadocs你应该抛出{{} 1}}。