我试图实现自己的HashSet,我不知道iterator()方法应该返回什么?

时间:2013-10-14 17:00:23

标签: java collections iterator hashset

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

我想实现类似的东西。

MyHashTables hashset = new MyHashTables();

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

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

请帮帮我!

3 个答案:

答案 0 :(得分:1)

iterator()方法应返回实现MyIterator接口的 new 对象。您说您已实施next()hasNext()方法。但是哪里?它应该与MyHashTable类不同。最有可能的是,你需要一个非静态的内部类。

我强调了“new”,因为你的类的用户希望能够同时使用多个迭代器。例如,对于双重迭代:

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();
     }

}

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

答案 1 :(得分: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的副本或是否有指向它的指针。这可能会改变内部变量的可见性..

祝你好运!

答案 2 :(得分: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的单独实例,否则可以通过调用第二次调用的结果来更改第一次调用的迭代器。 / p>