0

我创建了一个接口 MyIterator,它有两个方法声明 hasNext() 和 next()。MyHashSet 实现了 MyIterator。但我无法理解我应该在 iterator() 方法中添加什么?

我想实现这样的东西。

MyHashTables hashset = new MyHashTables();

    MyIterator<Object> iterator = hashset.iterator();

    while (iterator.hasNext()){
        System.out.println("Value: "+iterator.next() + " ");  
    }

请帮帮我!

4

3 回答 3

1

iterator()方法应该返回一个实现接口的对象。MyIterator你说你已经实现了next()andhasNext()方法。但是哪里?它应该与班级不同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();
     }

}

像这样的非静态内部类的优点是您可以在内部类中使用封闭类的非静态字段。

于 2013-10-14T18:07:54.223 回答
0

我想你想要这样的东西:

Iterface: MyIterator 将具有您所描述的 hasNext 和 next 方法。

类:MyHashSet

类:MyHashSetIterator 实现 MyIterator

你的 MyHashTable 类应该有它自己的数据结构(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 的副本或具有指向它的指针。这可能会改变您内部变量的可见性..

祝你好运!

于 2013-10-14T17:58:39.123 回答
0

从您的问题来看,尚不清楚您要做什么 - 所以我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,否则第一次调用的迭代器可以通过对第二次调用结果的调用来更改。

于 2013-10-14T18:06:25.417 回答