2012-07-10 15 views
7

Jestem w trakcie pisania zadania MR. Ale utknąłem z problemem związanym z obiektem Iterable. Muszę znaleźć jego rozmiar. Wrzuciłem go do obiektu List, ale było to błędne. (Listę można odrzucić do Iterable, ale nie można odwrócić.) Istnieje inny sposób, tj. Użycie Iteratora dla obiektu i zwiększenie licznika dla każdej wartości. Ale to nie jest optymalne rozwiązanie. Czy ktokolwiek może sugerować lepszy sposób?Jak znaleźć rozmiar obiektu Iterable?

Proszę, pomóż mi. Z góry dzięki.

+0

Proszę wpisać tutaj swój kod, abyśmy mogli go sprawdzić. –

+0

To pytanie nie ma ochoty duplikatu jednej połączonej w edycji – shieldgenerator7

Odpowiedz

15

Interfejs udostępnia metodę size() i rozszerza się o . Jeśli Twój iterator pochodzi z kolekcji, możesz zapytać o jego rozmiar, w przeciwnym razie masz pecha, musisz po prostu powtórzyć do końca.

Oto hack, który realizuje to:

public int size(Iterable<?> it) { 
    if (it instanceof Collection) 
    return ((Collection<?>)it).size(); 

    // else iterate 

    int i = 0; 
    for (Object obj : it) i++; 
    return i; 
} 
0

Iterator nie mają wielkość() na nim, ale niektóre zbiory z których Iterator został pochodzących ma wielkość(), jak Java. util.LinkedList.size(). W niektórych przypadkach może być konieczne wykonanie iteracji.

+0

Problem jest z funkcją reduktora: chroniony final void zmniejszenia (ostateczny klucz Tekst, \t \t \t \t końcowe iterowalny wartości, ostateczna kontekstowego Context) \t \t \t \t rzuca wyjątek IOException, InterruptedException { ...... } Tutaj "wartości" jest Iterable Object. Muszę znaleźć jego rozmiar bez iteracji. Ale to nie jest możliwe, ponieważ nie jest obiektem kolekcji. Muszę wykonać inną operację po znalezieniu rozmiaru. Jeśli wykonuję iterację nad tym obiektem, to po iteracji iterator wskaże jego ostatnią wartość. Muszę to zresetować. Używam ResetTableIterator, więc po iteracji mogę go zresetować. –

+0

Powinieneś móc poprosić o 'iterator()' tyle razy ile chcesz z 'Iterable', dlatego otrzymujesz' Iterable', a nie 'Iterator' w' reduce'. Więc 'Iterator a = values.iterator(), b = values.iterator();' jest całkowicie poprawne i powinny być niezależne, dopóki nie wywołasz 'remove()'. – TWiStErRob

5

Musisz przejść przez iterator i policzyć przedmioty. Na przykład

  while (iterator.hasNext()) { 
      iterator.next(); 
      count++; 
     } 

To nie jest bardzo czysty, ale iterator jest stosowany w celu iteracyjne i nie przewiduje żadnych szczególnych API dla tego.

Ale gdzie jest tworzony iterator? Jeśli pochodzi z innego obiektu, na przykład obiektu kolekcji, można określić rozmiar źródła, a nie samego iteratora.

+0

To nie zadziała w przypadku wersji iterowalnej. – Siddarth