【问题标题】:Implementing Iterable in Java remove() and iterator()在 Java remove() 和 iterator() 中实现 Iterable
【发布时间】:2011-12-03 23:51:50
【问题描述】:

我正在尝试用 Java 中的 Iterable 实现一个迭代器,这是我目前所拥有的:

public class keysIterator<A> implements Iteratble<A<{
     A[] elements;
     int nextElement; 

keysIterator(A[] elements, int nextElement) {
    this.elements = elements;
    this.nextElement = 0;
}

public boolean hasNext() {
    return this.nextElement < elements.length;
}

public A next() {
    A result = elements[nextElement];
    nextElement = nextElement + 1;
    return result;
}

public void remove() {
    // TODO Auto-generated method stub   
}

public Iterator<A> iterator() {
    // TODO Auto-generated method stub
}

}

我需要帮助编写删除和迭代器方法,非常感谢任何帮助。

谢谢。

【问题讨论】:

    标签: java iterator


    【解决方案1】:

    让 Iterator 实现 Iterable 对我来说没有意义

    Something Iterable 有一个 iterator() 方法,它返回一个 Iterator。

    此外,迭代器通常不保存数据,而是引用具有数据的其他实例。

    通常是这样

    class Foo implements Iterable
    {
        public Iterator iterator() {
            return new FooIterator();
        }
    }
    
    class FooIterator implements Iterator {
         // with methods as you've defined them
    }
    

    【讨论】:

      【解决方案2】:

      您将 Iterator 接口的实现与您的 Iterable 类混为一谈。试试这个:

      public class KeysIterable<A> implements Iterable<A> {
          A[] elements;
          int nElements;
      
          private class KeysIterator<A> implements Iterator<A> {
              int nextElement = 0;
      
              public boolean hasNext() {
                  return nextElement < nElements;
              }
      
              public A next() {
                  A result = elements[nextElement];
                  nextElement = nextElement + 1;
                  return result;
              }
      
              public void remove() {
                  if (nextElement < nElements - 1) {
                      System.arraycopy(elements, nextElement + 1,
                          elements, nextElement, nElements - nextElement - 1);
                  }
                  nElements--;
              }
          }
      
          public Iterator<A> iterator() {
              return new KeysIterator<A>();
          }
      
          public KeysIterable() {
      
          }
      
          // other methods
      }
      

      使用 ArrayList 而不是泛型数组来实现您的 Iterable 类可能会更好。

      【讨论】:

        【解决方案3】:

        使用 ArrayList 而不是数组,所以你可以这样做:

        public Iterator<A> iterator() {
            return elements.iterator();
        }
        

        如果你真的想要一个数组,你总是可以这样做:

        public Iterator<A> iterator() {
            return Arrays.asList(elements).iterator();
        }
        

        【讨论】:

          猜你喜欢
          • 2011-08-15
          • 2020-01-24
          • 2015-12-13
          • 1970-01-01
          • 1970-01-01
          • 2016-02-23
          • 1970-01-01
          • 2014-12-19
          • 2013-10-05
          相关资源
          最近更新 更多