Pytanie w sprawie iterator, java, list, arraylist – Konwertuj Iterator na ArrayList

206

DanyIterator<Element>, jak możemy to przekonwertowaćIterator doArrayList<Element> (lubList<Element>) wnajlepszy i najszybszy sposób możliwy, abyśmy mogli korzystaćArrayListoperacje na nim, takie jakget(index), add(element)itd.

Twoja odpowiedź

4   odpowiedź
327

Lepiej użyj biblioteki takiej jakGuawa:

import com.google.common.collect.Lists;

Iterator<Element> myIterator = ... //some iterator
List<Element> myList = Lists.newArrayList(myIterator);

Inny przykład Guawy:

ImmutableList.copyOf(myIterator);

lubKolekcje Apache Commons:

import org.apache.commons.collections.IteratorUtils;

Iterator<Element> myIterator = ...//some iterator

List<Element> myList = IteratorUtils.toList(myIterator);       
@CorayThan mniej testowanych kodów +. Chociaż zgadzam się z tobą, nie dodałbym dodatkowej zależności tylko po to, by użyć tej metody. Ale z drugiej strony większość moich (dużych) projektów korzysta z Guava lub Apache Commons ... Renaud
Zgadzam się z Renaudem i Stephanem. Ponadto, jeśli używasz narzędzia do budowania, najłatwiej jest włączyć te biblioteki na świecie ... TAKŻE ... jeśli naprawdę nie chcesz ich włączać, możesz przejść do źródła kodu Apache / Guava i skopiuj to, co tam zrobili: DUŻO lepiej niż tracić czas na odkrywanie setek pięknie zaprojektowanych i przetestowanych kół, które już są dostępne. mike rodent
Nie rozumiem tego. W jaki sposób lista ArrayList jest zwracana przez, powiedzmy, Guava, lepiej niż normalna lista ArrayList? Czy robią to w bardziej wydajny sposób? Nawet jeśli jest bardziej wydajny, czy naprawdę warto dodać dodatkową zależność (i większą złożoność) do projektu? CorayThan
@CorayThan Divide i podbij mojego przyjaciela. Po co pisać metodę, która jest już dostarczana przez bibliotekę i jest testowana? Używamy dużo Apache Commons i Guava, są po prostu niesamowite i pomagają zaoszczędzić czas i pieniądze. Stephan
61

Możesz skopiować iterator na nową listę taką jak ta:

Iterator<String> iter = list.iterator();
List<String> copy = new ArrayList<String>();
while (iter.hasNext())
    copy.add(iter.next());

Zakładamy, że lista zawiera łańcuchy. Naprawdę nie ma szybszego sposobu na odtworzenie listy z iteratora, utkniesz z ręcznym przeglądaniem listy i kopiowaniem każdego elementu do nowej listy odpowiedniego typu.

EDYTOWAĆ :

Oto ogólna metoda kopiowania iteratora na nową listę w bezpieczny sposób:

public static <T> List<T> copyIterator(Iterator<T> iter) {
    List<T> copy = new ArrayList<T>();
    while (iter.hasNext())
        copy.add(iter.next());
    return copy;
}

Użyj tego w ten sposób:

List<String> list = Arrays.asList("1", "2", "3");
Iterator<String> iter = list.iterator();
List<String> copy = copyIterator(iter);
System.out.println(copy);
> [1, 2, 3]
199

W Javie 8 możesz użyć nowegoforEachRemaining metoda dodana doIterator berło:

List<Element> list = new ArrayList<>();
iterator.forEachRemaining(list::add);
@javadba Pierwotne pytanie dotyczyło konwertowania iteratora, który już posiadasz, na nową tablicę ArrayList. Dla celów tego przykładu zakłada się, że iterator, który już masz, jest wywoływanyiterator. Stuart Marks
@AquariusPower The:: składnia jest nowa w Javie 8 i odnosi się do „odwołania do metody”, które jest skrótową formą lambda. Zobacz tutaj, aby uzyskać więcej informacji:docs.oracle.com/javase/tutorial/java/javaOO/… Stuart Marks
gdzie jestiterator pochodzi z? jest to nierozwiązany symbol javadba
To powinna być zaakceptowana odpowiedź, ponieważ jest najkrótsza i nie zależy od bibliotek innych firm DanielCuadra
20

Możesz także użyćIteratorUtils z Apachezbiory wspólne, chociaż nie obsługuje typów ogólnych:

List list = IteratorUtils.toList(iterator);
Posiada również metodę 2 toArray, a 1 akceptuje typ:commons.apache.org/proper/commons-collections/javadocs/…, java.lang.Class) dwana

Powiązane pytania