【问题标题】:How do I reset an iterator in Java?如何在 Java 中重置迭代器?
【发布时间】:2016-08-17 05:14:46
【问题描述】:

下面,我有一个名为Sigma 的集合的迭代器。当while 循环完成时,如何将迭代器重置为其第一个元素?

Iterator it = Sigma.iterator();

while (it.hasNext()) {
    letter = (String)it.next();
    System.out.println(letter);
}

【问题讨论】:

  • 我认为你不应该。要重置,只需从底层数据结构中获取一个新的迭代器。 Iterator是一个接口,只提供了3个方法,hasNextnextremove
  • 嘿伙计们,你真的没有通过从底层数据结构请求新的迭代器来解决问题,你只是在逃避这种情况下的问题,如果底层数据结构已经改变会发生什么自从我们上次得到一个迭代器??
  • 和OP,你为什么需要重置迭代器?再次迭代它?只在一个循环中做你想做的事,为什么要把它分成2个循环??
  • @LaVloZMerrill “如果自从我们上次获得迭代器后底层数据结构发生了变化,会发生什么?” 我想你是在想象迭代器存储一个集合创建时的状态快照,但对于大多数集合,包括 OP 的HashSet,情况并非如此。它直接从集合中读取,并且在迭代期间添加或删除任何值都是无效的,除了通过 Iterator.remove() 方法删除当前迭代的值之外,因此任何其他修改都不是问题,因为你是不允许这样做。
  • @Boann 我不是在想象,我是在笼统地说,如果 Iterator 是否存储快照,这是一个实现细节。

标签: java collections iterator hashset


【解决方案1】:

迭代器没有重置方法,也不需要。馆藏不像需要倒带的盒式磁带。您可以简单地放弃旧的迭代器。

每次调用.iterator(),集合都会返回一个从头开始的新迭代器。

【讨论】:

    【解决方案2】:

    我没有对迭代器做太多工作,但我猜你可以将迭代器设置为其原始状态。

    Iterator it =  Sigma.iterator();
    
    while(it.hasNext()){
        letter= (String) it.next();
        System.out.println(letter);
    }
    
    it =  Sigma.iterator();
    

    【讨论】:

    • 这不是将 Iterator 设置为其原始状态,而是向 Sigma 请求新的迭代器,如果 Sigma 值没有改变它的 okey,但它已经改变了什么? (从 Sigma 添加或删除新值),您将获得具有不同值的新迭代器。
    • @LaVloZMerrill 这是一个很好的观点。我想唯一的解决方案是在开始时创建 Sigma 的深层副本,然后将其用于迭代。
    • @RayondKelly 这个问题有很多解决方案,你可以制作一个接受迭代器的可重置迭代器,这个可重置迭代器将首先迭代提供的迭代器,将每个对象迭代处理到一个内部数组,然后当重置,它将其索引返回到第一个(一种低效的方式),另一种简单的方式,只是确保底层数据结构不会改变,在收集的情况下,您可以通过 Collections.unmodifiableXXX 方法装饰类来强制这种行为,当然可能存在其他解决方案:)
    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2018-10-29
    • 2016-04-09
    • 1970-01-01
    • 2015-01-01
    • 2011-01-16
    相关资源
    最近更新 更多