Apakah Anda benar-benar mencoba menghindari penggunaan iterator, atau Anda tidak ingin melihatnya dalam kode sumber Anda ?
Jon Skeet
2
Anda dapat membuat kode lebih pendek dan lebih bersih, tetapi Anda harus menggunakan Iterator. Apakah ada alasan Anda ingin menghindarinya?
Peter Lawrey
5
Sekadar catatan dan penjelasan mengapa harus menghindari iterator: Saat ini saya sedang menghadapi masalah itu dalam game Android yang ditulis di Jawa. Saat ini saya menggunakan HashSet untuk menyimpan pendengar yang perlu diberitahu tentang acara secara teratur. Namun, berulang-ulang koleksi menyebabkan kegiatan pengumpul sampah berat yang dapat membebani loop permainan. Dan itu adalah larangan dalam permainan Java. Saya akan menulis ulang bagian-bagian ini.
tiguchi
12
@thecoshman Saya hanya berbicara dari perspektif pengembangan game Java di mana Anda ingin menghindari GC selama pembaruan status game reguler di semua biaya. Iterator hanya objek sementara berguna karena Anda tidak dapat mengatur ulang mereka ke awal, oleh karena itu mereka dapat diciptakan kembali pada setiap panggilan metode iterasi (lihat sumber ArrayList.java misalnya). Jika digunakan dalam loop game untuk mengulangi objek adegan dan mempertimbangkan setidaknya 30 pembaruan per detik Anda berakhir dengan setidaknya 60 (adegan biasanya diulang dua kali per siklus) objek iterator per detik dalam memori menunggu GC. Itu memiliki dampak besar pada Android.
tiguchi
9
Mungkin orang harus memilih struktur data yang lebih memadai dalam kasus itu? Satu set tidak dirancang untuk beralih secara efisien. Mengapa tidak menggunakan ArrayList dan beralih di atasnya dengan standar untuk loop? Tidak ada iterator tambahan yang dibuat, akses baca sangat cepat.
Saya percaya ini menggunakan iterator di belakang layar.
munyengm
22
@ munyengm Ya. Tidak ada cara untuk beralih pada set tanpa iterator, selain mengakses struktur yang mendasarinya yang menyimpan data melalui refleksi, dan mereplikasi kode yang disediakan oleh Set # iterator ...
assylias
1
Ini berfungsi, tetapi jika itu bisa memberikan masalah maka itu bukan solusi bagi saya. Saya kira saya tidak punya pilihan, saya harus menggunakan Iterator. Terima kasih untuk semuanya.
user1621988
39
@ user1621988 Masalah apa? Tidak ada masalah dengan kode yang saya berikan. Itu hanya menyediakan cara yang bagus dan bersih untuk mengulangi set tanpa harus secara eksplisit menggunakan iterator.
assylias
90
Setidaknya ada enam cara tambahan untuk beralih pada satu set. Berikut ini diketahui oleh saya:
Metode 1
// Obsolete CollectionEnumeration e =newVector(movies).elements();while(e.hasMoreElements()){System.out.println(e.nextElement());}
Metode 2
for(String movie : movies){System.out.println(movie);}
Metode 3
String[] movieArray = movies.toArray(newString[movies.size()]);for(int i =0; i < movieArray.length; i++){System.out.println(movieArray[i]);}
Metode 4
// Supported in Java 8 and above
movies.stream().forEach((movie)->{System.out.println(movie);});
Metode 5
// Supported in Java 8 and above
movies.stream().forEach(movie ->System.out.println(movie));
Metode 6
// Supported in Java 8 and above
movies.stream().forEach(System.out::println);
Inilah HashSetyang saya gunakan untuk contoh saya:
Set<String> movies =newHashSet<>();
movies.add("Avatar");
movies.add("The Lord of the Rings");
movies.add("Titanic");
Pernyataan for memiliki formulir yang dirancang untuk iterasi melalui Koleksi dan array. Formulir ini kadang-kadang disebut sebagai pernyataan yang disempurnakan, dan dapat digunakan untuk membuat loop Anda lebih ringkas dan mudah dibaca.
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 elementThrows:NullPointerException-if the specified action is nullSince:1.8
Namun ada jawaban yang sangat bagus sudah tersedia untuk ini. Inilah jawaban saya:
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
Juga, jika Set ini adalah tipe kelas Kustom, misalnya: Pelanggan.
Jawaban:
Anda dapat menggunakan loop yang disempurnakan untuk :
Atau dengan Java 8:
sumber
Setidaknya ada enam cara tambahan untuk beralih pada satu set. Berikut ini diketahui oleh saya:
Metode 1
Metode 2
Metode 3
Metode 4
Metode 5
Metode 6
Inilah
HashSet
yang saya gunakan untuk contoh saya:sumber
stream()
.Mengubah set Anda menjadi array juga dapat membantu Anda untuk mengulangi elemen-elemen:
sumber
toArray
panggil iterator set.Untuk mendemonstrasikan, pertimbangkan set berikut, yang menampung objek Person berbeda:
sumber
Anda dapat menggunakan operasi fungsional untuk kode yang lebih rapi
sumber
Berikut adalah beberapa tips tentang cara mengembalikan Set bersama dengan kinerja mereka:
Kode ini jelas.
Hasil dari durasi adalah:
Kita bisa melihat
Lambda
yang paling lamaIterator
adalah yang paling cepat.sumber
Pencacahan (?):
Cara lain (java.util.Collections.enumeration ()):
Java 8:
atau
sumber
Namun ada jawaban yang sangat bagus sudah tersedia untuk ini. Inilah jawaban saya:
Juga, jika Set ini adalah tipe kelas Kustom, misalnya: Pelanggan.
// Kelas pelanggan:
sumber