Czy faktycznie próbujesz uniknąć użycia iteratora, czy po prostu nie chcesz go widzieć w kodzie źródłowym?
Jon Skeet,
2
Możesz sprawić, że kod będzie krótszy i bardziej przejrzysty, ale musisz użyć iteratora. Czy jest powód, dla którego chcesz tego uniknąć?
Peter Lawrey,
5
Dla przypomnienia i dla wyjaśnienia, dlaczego warto unikać iteratora: obecnie mam do czynienia z tym problemem w grze na Androida napisanej w Javie. Obecnie używam HashSet do przechowywania słuchaczy, którzy muszą być regularnie powiadamiani o zdarzeniach. Jednak powtarzające się iteracje kolekcji powodują intensywne działania śmieciarek, które mogą obciążać pętlę gry. I nie da się tego zrobić w grze Java. Zamierzam przepisać te części.
tiguchi
12
@ thecoshman Mówię tylko z perspektywy tworzenia gier Java, w której chcesz uniknąć GC podczas regularnych aktualizacji stanu gry za wszelką cenę. Iteratory są tylko tymczasowo użytecznymi obiektami, ponieważ nie można ich zresetować do początku, dlatego są one odtwarzane przy każdym wywołaniu metody iteracji (patrz na przykład źródło ArrayList.java). Jeśli zostanie użyty w pętli gry do iteracji obiektów sceny i biorąc pod uwagę co najmniej 30 aktualizacji na sekundę, otrzymujesz co najmniej 60 (scena jest zwykle iterowana dwa razy na cykl) obiektów iteratora na sekundę czekających na GC. Ma to duży wpływ na Androida.
tiguchi
9
Być może w takim przypadku należy wybrać bardziej odpowiednią strukturę danych? Zestaw nie jest przeznaczony do iteracji. Dlaczego nie skorzystać z ArrayList i iterować ją za pomocą standardowej pętli for? Nie są tworzone dodatkowe iteratory, dostęp do odczytu jest bardzo szybki.
@munyengm Tak to robi. Nie ma sposobu na iterację po zestawie bez iteratora, oprócz uzyskania dostępu do podstawowej struktury, która przechowuje dane poprzez odbicie i replikacji kodu dostarczonego przez Set # iterator ...
assylias
1
To działa, ale jeśli może powodować problemy, nie jest to dla mnie rozwiązanie. Chyba nie mam wyboru, muszę użyć Iteratora. Dzięki za wszystko.
user1621988,
39
@ user1621988 Jakie problemy? Nie ma problemów z podanym kodem. Zapewnia po prostu przyjemny i czysty sposób na iterację po zestawie bez konieczności jawnego używania iteratora.
assylias
90
Istnieje co najmniej sześć dodatkowych sposobów na iterację w zestawie. Znane są mi:
Metoda 1
// Obsolete CollectionEnumeration e =newVector(movies).elements();while(e.hasMoreElements()){System.out.println(e.nextElement());}
Metoda 2
for(String movie : movies){System.out.println(movie);}
Metoda 3
String[] movieArray = movies.toArray(newString[movies.size()]);for(int i =0; i < movieArray.length; i++){System.out.println(movieArray[i]);}
Metoda 4
// Supported in Java 8 and above
movies.stream().forEach((movie)->{System.out.println(movie);});
Metoda 5
// Supported in Java 8 and above
movies.stream().forEach(movie ->System.out.println(movie));
Metoda 6
// Supported in Java 8 and above
movies.stream().forEach(System.out::println);
Oto, HashSetczego użyłem w moich przykładach:
Set<String> movies =newHashSet<>();
movies.add("Avatar");
movies.add("The Lord of the Rings");
movies.add("Titanic");
Instrukcja for ma formę zaprojektowaną do iteracji po kolekcjach i tablicach. Forma ta jest czasem nazywana rozszerzoną instrukcją for i może być używana do tworzenia bardziej zwartych i czytelnych pętli.
defaultvoid forEach(Consumer<?super T> action)Performs the given action for each element of the Iterable until all elements have been processed or the action throws an exception.Unless otherwise specified by the implementing class, actions are performed in the order of iteration (if an iteration order is specified).Exceptions thrown by the action are relayed to the caller.ImplementationRequirements:Thedefault implementation behaves as if:for(T t :this)
action.accept(t);Parameters: action -The action to be performed for each element
Throws:NullPointerException-if the specified action is nullSince:1.8
Istnieją jednak bardzo dobre odpowiedzi na to pytanie. Oto moja odpowiedź:
1. set.stream().forEach(System.out::println);// It simply uses stream to display set values2. set.forEach(System.out::println);// It uses Enhanced forEach to display set values
Ponadto, jeśli ten zestaw jest typu klasy niestandardowej, na przykład: klient.
Odpowiedzi:
Możesz użyć rozszerzonej pętli for :
Lub z Javą 8:
źródło
Istnieje co najmniej sześć dodatkowych sposobów na iterację w zestawie. Znane są mi:
Metoda 1
Metoda 2
Metoda 3
Metoda 4
Metoda 5
Metoda 6
Oto,
HashSet
czego użyłem w moich przykładach:źródło
stream()
.Przekształcenie zestawu w tablicę może również pomóc w iteracji po elementach:
źródło
toArray
wywołuje iterator zestawu.Aby zademonstrować, rozważ następujący zestaw, który zawiera różne obiekty Person:
źródło
Możesz użyć operacji funkcjonalnej, aby uzyskać bardziej czysty kod
źródło
Oto kilka wskazówek, jak iterować Zestaw wraz z ich występami:
Kod jest oczywisty.
Wynikiem tych czasów są:
Widzimy, że
Lambda
zajmuje to najdłużej, podczas gdyIterator
jest najszybszy.źródło
Wyliczenie(?):
Inny sposób (java.util.Collections.enumeration ()):
Java 8:
lub
źródło
Istnieją jednak bardzo dobre odpowiedzi na to pytanie. Oto moja odpowiedź:
Ponadto, jeśli ten zestaw jest typu klasy niestandardowej, na przykład: klient.
// Klasa klienta:
źródło