繁体   English   中英

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

[英]I am trying to implement my own HashSet and I do not know what iterator() method should return?

我创建了一个接口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()方法。 但是哪里? 它应该与MyHashTableMyHashTable类中。 您最有可能需要一个非静态内部类。

我强调“新”是因为您的类的用户希望能够同时使用多个迭代器。 例如,两次迭代:

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

}

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

我想你想要这样的东西:

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的副本或具有指向它的指针。 这可能会更改内部变量的可见性。

祝好运!

从您的问题来看,您不清楚要执行的操作-因此,我将猜测 MyIterator是JDK的Iterator接口的实现,而MyHashset实现了JDK的Set接口。

如果是这样,您几乎肯定不希望您的哈希集直接实现迭代器。 迭代器是有状态的-它们在以某种方式排序的对象集合中跟踪其当前位置。 因此,您将单独实现该iterator() ,并在每次调用iterator()时返回一个新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实例,否则可以通过对第二个调用的结果进行调用来更改第一个调用的迭代器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM