【问题标题】:Iterable - Move to specified position可迭代 - 移动到指定位置
【发布时间】:2017-05-15 13:47:26
【问题描述】:
  • 我需要一个可迭代的数据结构,它提供以下可能性 标准的Iterator<> 接口(@98​​7654322@、hasNext() 等)。

  • 此外,应该可以将迭代器重新定位在 某个位置。


是否有任何类已经提供了上述可能性?


否则我会实现以下内容:

public class PositionableIterator<E> implements Iterator<E> {

  private final List<E> delegate;
  private Iterator<E> iterator;

  public PositionableIterator(List<E> delegate) {
    this.delegate = delegate;
    this.iterator = delegate.iterator();
  }

  public void moveTo(int index) {
    this.iterator = delegate.listIterator(index);
  }

  public void moveTo(E element) {
    this.iterator = delegate.listIterator(delegate.indexOf(element));
  }

  @Override
  public boolean hasNext() {
    return iterator.hasNext();
  }

  @Override
  public E next() {
    return iterator.next();
  }
}

您认为使用这种方法有什么缺点吗?

【问题讨论】:

  • 一个缺点是,如果List 没有随机访问(顺序访问,链表),那么每次调用moveTo 时,它都会被解析到第一个索引对象。这对于大型列表来说是昂贵的。 moveTo(E element) 的成本更高。

标签: java iterator


【解决方案1】:

我建议将迭代器转换为列表并使用它的功能。因为这样更容易理解和维护。有转换Convert Iterator to ArrayList的例子

【讨论】:

    【解决方案2】:

    您可以通过以下方式达到同样的效果:

    Iterator<String> iterator = input.iterator();
    for (; index > 0; --index) {
          iterator.next();       // move the iterator to index
    }
    

    【讨论】:

      【解决方案3】:

      您还可以使用 Google guava Iterables 方法从 Iterable 中获取特定位置的项目。

      
      Iterator<Something> iterator = repo.GetMyIterator();
      
      Something atPos5 = Iterables.get(iterator, 5);
      
      

      【讨论】:

        猜你喜欢
        • 2017-03-21
        • 2018-07-25
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多