2017-01-26 68 views
2

我是编程的初学者,我有这样的东西,如Iterator<Iterator<Integer>> itit中的每个迭代器都是一个数字序列。像:迭代器中的整数序列迭代器(Java)

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)) 

我需要一种方法,其将returnIterator<Integer> (1, 2, 3, 4, 5, 6, 7, 8, 9),如:

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

尺寸以及每个值迭代器的it中的数字序列可能不同。

我知道我必须自己尝试做,但我甚至都不知道这里会发生什么。

+2

听起来你正在寻找番石榴的['Iterators.concat'](https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/ Iterators.html#CONCAT-java.util.Iterator-)。 –

回答

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(); 
} 
0

我觉得有人也许能为您提供更有效的方式,但你仍然可以聚集在一个List<Integer>其迭代器中的所有数据,你会回来:

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

一个不太完美的解决方案(因为不使用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(); 
}