2017-01-26 3 views
2

私はプログラミングの初心者です。私はIterator<Iterator<Integer>> itというようなものを持っています。 itの各イテレータは一連の数字です。以下のような:別の角度から見た場合イテレータのイテレータの整数シーケンス(Java)

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

itは次のとおりです。

Iterator<Integer> convert(Iterator<Iterator<Integer>> it) { 
     // How to do it? 
} 
それぞれの

サイズと値:

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

私が好きになるでしょうreturnIterator<Integer> (1, 2, 3, 4, 5, 6, 7, 8, 9)方法を、必要とします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

あまりエレガントな解決策(ので、

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(); 
} 
関連する問題