2017-01-26 137 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(); 
}