【问题标题】:Integer sequences in Iterator of Iterators (Java) [duplicate]迭代器迭代器(Java)中的整数序列
【发布时间】:2017-06-12 04:03:44
【问题描述】:

我是编程初学者,我有 Iterator<Iterator<Integer>> it 这样的东西。 it 中的每个迭代器都是一个数字序列。喜欢:

Iterator1 - (1, 2, 3)
Iterator2 - (4, 5, 6)
Iterator3 - (7, 8, 9)

从不同的角度来看,it 是:

Iterator<Iterator<Integer> ((1, 2, 3), (4, 5, 6), (7, 8, 9))

我需要一个方法,它将return Iterator&lt;Integer&gt; (1, 2, 3, 4, 5, 6, 7, 8, 9),比如:

 Iterator<Integer> convert(Iterator<Iterator<Integer>> it) {
        // How to do it?
 }

it 中每个迭代器的数列的大小和值可能不同。

我知道我必须自己尝试,但我什至不明白这里应该发生什么。

【问题讨论】:

标签: java iterator sequence


【解决方案1】:

如果您不想“预先遍历”迭代器,例如通过将它们收集到一个列表中,然后将迭代器返回到该列表,您可以从Iterator 创建一个Spliterator,使用StreamSupport 将其转换为Stream,并使用flatMap 执行相同操作使用内部迭代器,然后获取该扁平流的迭代器。

public static <E> Iterator<E> convert(Iterator<Iterator<E>> iterators) {
    return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterators, 0), false)
            .flatMap(it -> StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, 0), false))
            .iterator();
}

【讨论】:

  • 很好的解决方案,非常适合在使用分页时获取静态数据的情况
【解决方案2】:

我认为有人可能会为您提供更有效的方法,但您仍然可以将所有数据汇总到 List&lt;Integer&gt; 中,您将返回该迭代器:

Iterator<Integer> flatten(Iterator<Iterator<Integer>> it) {
    List<Integer> allIntegers = new ArrayList<>();
    it.forEachRemaining(subIt -> subIt.forEachRemaining(value -> allIntegers.add(value)));
    return allIntegers.iterator();
}

【讨论】:

    【解决方案3】:

    一个不太优雅的解决方案(因为不使用 Java-8 lambda)是这样的:

     Iterator<Integer> convert(Iterator<Iterator<Integer>> it) {
         List<Integer> list = new ArrayList<>();
         while (it.hasNext()) {
             Iterator<Integer> it2 = it.next();
             while (it2.hasNext()) {
                 list.add(it2.next());
             }
         }
         return list.iterator();
     }
    

    【讨论】:

      猜你喜欢
      • 2012-03-23
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多