我创建了一个接口MyIterator,它有两个方法声明hasNext()和next()。MyHashSet 实现了 MyIterator。但是我无法理解我应该在 iterator() 方法中放入什么?
我想实现这样的东西。
MyHashTables hashset = new MyHashTables();
MyIterator<Object> iterator = hashset.iterator();
while (iterator.hasNext()){
System.out.println("Value: "+iterator.next() + " ");
}
请帮帮我!
iterator()
方法应返回实现MyIterator
接口的新对象。你说你已经实现了next()
和hasNext()
方法。但是在哪里呢?它应该与MyHashTable
类位于不同的类中。最有可能的是,您需要一个非静态的内部类。
我之所以强调"新",是因为您的类用户希望能够同时使用多个迭代器。例如,对于双重迭代:
MyIterator outerIterator = hashSet.iterator();
while (outerIterator.hasNext) {
MyIterator innerIterator = hashSet.iterator();
while (innerIterator.hasNext()) {
Object o1 = outerIterator.next();
Object o2 = innerIterator.next();
// Work with o1 and o2.
}
}
因此,您的代码应如下所示:
public class MyHashTable {
private class HashTableIterator implements MyIterator {
// HashTableIterator fields
// HashTableIterator contructor
public Object next() {
// Implementation of next()
}
public boolean hasNext() {
// Implementation of hasNext()
}
}
// MyHashTable fields
// MyHashTable constructor(s)
// MyHashTable methods
public MyIterator iterator() {
return new HashTableIterator();
}
}
像这样的非静态内部类的优点是可以在内部类中使用封闭类的非静态字段。
从你的问题来看,不清楚你想做什么 - 所以我会猜测MyIterator是JDK Iterator
接口的实现,MyHashset
实现了JDK的Set
接口。
如果是这样,您几乎肯定不希望哈希集直接实现迭代器。 迭代器是有状态的 - 它们跟踪它们在以某种方式排序的对象集合中的当前位置。 因此,您将单独实现它,并在每次调用iterator()
时返回一个新的。
下面是如何实现迭代器的简单示例
class ArrayIterator {
private final Object[] arr;
private int position = -1;
ArrayIterator(Object... objs) { this.arr = objs; }
public boolean hasNext() { return position < arr.length; }
public Object next () { return arr[++position]; }
}
如果在集合上调用iterator()
两次,则需要返回单独的Iterator
实例,否则第一次调用的迭代器可以通过调用第二次调用的结果来更改。
我想你想要这样的东西:
Iterface:MyIterator,它将具有您所描述的Next和Next方法。
类: 我的哈希集
类:MyHashSetIterator 实现 MyIterator
你的MyHashTable Class应该有自己的数据结构(DS) - 比如一个对象数组
MyHashSetIterator 应该有 next() 和 hasNext() 的方法,如你所描述的。 它还需要具有内部 DS 的副本以及指向此 DS 中当前位置的指针。
MyHashTable 类中的 iterator() 方法返回此 MyHashSetIterator 类的副本。 像这样:
Class MyHashSet {
protected MyHashSetIterator _interator;
protected Object[] _internalData;
public MyIterator iterator() {
MyIterator result = new MyHashSetIterator(_internalData);
return result;
}
}
Class MyHashSetIterator implements MyIterator {
protected Object[] _iteratorData;
public MyHashSetIterator(Object[] theData) {
//code to populate _iteratorData with theData
//code to initialize point to first element of _iteratorData
}
public boolean hasNext() {
//code to see if pointer has/has not reached end of internal datastructure
}
public Object next() {
//code to return Object at element in Object array pointed at by pointer
}
}
}
请记住,将迭代器与MyHashSet同步在这里非常重要。 也就是说,当你抓取迭代器,但随后添加到 MyHashSet 时,你将如何处理这种情况? 您需要确定 MyIterator 是否有 MyHashSet DS 的副本或有指向它的指针。 这可能会改变内部变量的可见性。
祝你好运!