2017-01-26 11 views
2

Я начинаю программировать, и у меня есть такая вещь, как Iterator<Iterator<Integer>> it. Каждый итератор в it представляет собой последовательность чисел. Как:Целочисленные последовательности в Итераторе итераторов (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

Если вы не хотите «пред-ходить» итераторами, например собирая их в списке и затем возвращая итератор в этот список, вы можете создать Spliterator из Iterator, используйте 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 лямбда):

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

 Смежные вопросы

  • Нет связанных вопросов^_^