Java Iterable-移动到指定位置

Java Iterable-移动到指定位置,java,iterator,Java,Iterator,我需要一个可移植的数据结构,提供 标准的迭代器接口(next(),hasNext(),等等) 此外,应该可以在一个特定的位置重新定位迭代器 一定的位置 有没有已经提供上述可能性的类 否则,我将实现如下内容: public class PositionableIterator<E> implements Iterator<E> { private final List<E> delegate; private Iterator<E>

我需要一个可移植的数据结构,提供 标准的迭代器接口(
next()
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();
      }
    }
    
    public类positionable迭代器实现迭代器{
    非公开最终名单代表;
    私有迭代器;
    公共位置迭代器(列表委托){
    this.delegate=委托;
    this.iterator=delegate.iterator();
    }
    公共无效移动到(整数索引){
    this.iterator=delegate.listIterator(索引);
    }
    公共无效移动到(E元素){
    this.iterator=delegate.listIterator(delegate.indexOf(element));
    }
    @凌驾
    公共布尔hasNext(){
    返回iterator.hasNext();
    }
    @凌驾
    公共教育{
    返回iterator.next();
    }
    }
    

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

    我建议将迭代器转换为列表并使用其功能。因为这样更容易理解和维护。这里有一个转换的例子,我建议将迭代器转换为list并使用它的功能。因为这样更容易理解和维护。有一个转换的示例,您可以通过执行以下操作来实现相同的转换:

    Iterator<String> iterator = input.iterator();
    for (; index > 0; --index) {
          iterator.next();       // move the iterator to index
    }
    
    Iterator Iterator=input.Iterator();
    对于(;索引>0;--索引){
    iterator.next();//将迭代器移动到索引
    }
    
    您可以通过执行以下操作来实现相同的目的:

    Iterator<String> iterator = input.iterator();
    for (; index > 0; --index) {
          iterator.next();       // move the iterator to index
    }
    
    Iterator Iterator=input.Iterator();
    对于(;索引>0;--索引){
    iterator.next();//将迭代器移动到索引
    }
    
    您还可以使用Google guavas方法从Iterable的特定位置获取项目

    
    Iterator<Something> iterator = repo.GetMyIterator();
    
    Something atPos5 = Iterables.get(iterator, 5);
    
    
    
    迭代器迭代器=repo.GetMyIterator();
    atPos5=Iterables.get(迭代器,5);
    
    您还可以使用Google guavas方法从Iterable的特定位置获取项目

    
    Iterator<Something> iterator = repo.GetMyIterator();
    
    Something atPos5 = Iterables.get(iterator, 5);
    
    
    
    迭代器迭代器=repo.GetMyIterator();
    atPos5=Iterables.get(迭代器,5);
    
    一个缺点是,如果
    列表
    没有随机访问(顺序访问、链表),那么每次调用
    moveTo
    时,它都会被解析到索引th对象。这对于一个大的列表来说是昂贵的
    moveTo(E元素)
    的成本更高。一个缺点是,如果
    列表
    没有随机访问(顺序访问、链表),那么每次调用
    moveTo
    都会将其解析到索引th对象。这对于一个大的列表来说是昂贵的<代码>移动到(E元素)的成本更高。