代码之家  ›  专栏  ›  技术社区  ›  polygenelubricants

迭代器性能约定(并用于非集合)

  •  2
  • polygenelubricants  · 技术社区  · 15 年前

    如果你所做的只是简单的一次迭代(即 hasNext() next() 没有 remove() ),是否保证线性时间性能和/或每次操作的摊余固定成本?

    这是在 Iterator 哪里有合同?

    有数据结构/爪哇吗? Collection 哪些不能在线性时间内迭代?

    java.util.Scanner implements Iterator<String> . 一 Scanner 不是数据结构(例如 移除() 完全没有意义)。这被认为是设计失误吗?

    有点像 PrimeGenerator implements Iterator<Integer> 被认为是糟糕的设计,还是这正是 迭代器 是为了什么?( HasNeXT() 总是返回true, 下() 按需计算下一个数字, 移除() 毫无意义)。

    同样的,这对 java.util.Random implements Iterator<Double> ?

    类型是否真正实现 迭代器 如果它只有效地使用了三分之一的api?(即不 移除() ,总是 HasNeXT() )

    5 回复  |  直到 15 年前
        1
  •  7
  •   bmargulies    15 年前

    没有这样的保证。正如您所指出的,任何人都可以将任何东西建模为迭代器。迭代器的各个生产者必须指定各自的性能。

        2
  •  3
  •   Kevin Bourrillion Gergely    15 年前

    里面什么都没有 Iterator documentaton 提到任何形式的履约保证,所以没有保证。

    在这样一个通用工具上要求这种约束也是没有意义的。

    一个更有用的约束是文档 iterator() 方法来指定 迭代器 实例 实现(例如 迭代器 超过一般用途 Collection 最有可能保证线性时间运行)。

    同样,文档中的任何内容都不需要 hasNext() 永远回来 false ,如此无尽 迭代器 完全正确。

    然而,有一个普遍的假设是 迭代器 实例的行为类似于“正常” 迭代器 返回的实例 Collection.iterator() 它们返回一些值 结束 在某个时刻。文档并不要求这样做,严格地说,依赖于这个事实的任何代码都会被微妙地破坏。

        3
  •  1
  •   Rex Kerr    15 年前

    你所有的建议听起来都合情合理 Iterator . api文档明确表示 remove 不需要支持,并建议不使用旧的 Enumeration 工作起来就像 迭代器 除非没有移除。

    此外,无限长流在函数式编程中是一个非常有用的概念,可以用 迭代器 总是这样 hasNext . 它可以处理任何一种情况。

        4
  •  1
  •   Steve B.    15 年前

    听起来你在考虑一个列表或集合遍历的迭代器。我认为一个更有用的心理模型是一个离散的对象流,你想一次处理一个对象流,这个对象流可以从一个源中以离散实例的形式流出来。

    从这个意义上说,质数流或列表对象流都是有意义的,而且模型并不意味着数据源的有限性。

        5
  •  0
  •   Enno Shioji    15 年前

    我可以想象这个用例。这似乎很直观。就我个人而言,我认为这很好。

    for(long prime : new PrimeGenerator()){
        //do stuff
        if(condition){
            break;
        }
    }