1. Latar mburi carane iterator teka
Sampeyan wis kenal karo HashSet. Yen sampeyan wis nyelidiki tenan, ngluwihi mung maca pelajaran, mula sampeyan kudu takon pitakonan iki:
Kepiye carane nampilake dhaptar kabeh unsur HashSet ing layar? Sawise kabeh, antarmuka ora duwe get()lan set()cara!
Lan HashSetora mung ing watesan iki. Kajaba iku HashSet, ana akeh koleksi liyane sing ora ngidini unsur bisa dijupuk dening indeks, amarga unsur ora urutan ditetepake.
Sajrone pirang-pirang taun, programer wis nemokake akeh struktur data sing kompleks, kayata grafik lan wit. Utawa dhaptar dhaptar.
Akeh wadhah ngganti urutan unsur nalika unsur anyar ditambahake utawa unsur sing wis ana dibusak. Contone, dhaptar nyimpen unsur ing urutan tartamtu, lan nalika unsur anyar ditambahake, meh tansah dilebokake ing tengah dhaftar.
Lan kita uga entuk kahanan sing ana wadhah sing nyimpen unsur nanging ora ana ing urutan tetep.
Saiki ayo ngomong yen kita pengin nyalin kabeh unsur saka koleksi kasebut menyang array utawa dhaptar. Kita kudu njupuk kabeh unsur. Kita ora preduli babagan urutan sing diulang ing unsur - sing penting yaiku ora ngulang unsur sing padha luwih saka sepisan. Kepiye carane nindakake?
2. Iterator kanggo koleksi
Iterator diusulake minangka solusi kanggo masalah ing ndhuwur.
Iterator minangka obyek khusus sing ana gandhengane karo koleksi, sing mbantu ngliwati kabeh unsur koleksi tanpa mbaleni.
Sampeyan bisa nggunakake kode ing ngisor iki kanggo entuk iterator kanggo koleksi apa wae:
Iterator<Type> it = name.iterator();
Endi namejeneng variabel koleksi, Typeyaiku jinis unsur koleksi, iterator()minangka salah sawijining metode koleksi, lan itjeneng variabel iterator.
Objek iterator nduweni 3 cara:
| Metode | Katrangan |
|---|---|
|
Ngasilake unsur sabanjure ing koleksi |
|
Priksa manawa ana unsur sing durung dilewati |
|
Mbusak unsur koleksi saiki |
Cara kasebut meh padha karo kelas nextInt)lan hasNextInt()metode Scanner.
Cara kasebut next()ngasilake unsur koleksi sabanjure sing entuk iterator.
Cara hasNext()mriksa apa koleksi duwe unsur tambahan sing iterator durung bali.
Mangkene carane nampilake kabeh unsur a HashSet:
| Kode | Cathetan |
|---|---|
|
Nggawe HashSetobyek sing nyimpen Stringunsur. We nambah salam ing macem-macem basa kanggo setvariabel. Entuk obyek iterator kanggo setset kasebut. Anggere isih ana unsur Entuk unsur sabanjure Nampilake unsur ing layar |
3. For-eachgelung
Kerugian utama iterator yaiku kode sampeyan dadi luwih rumit tinimbang nggunakake forloop.
Kanggo mbandhingake, ayo nampilake dhaptar nggunakake forloop lan uga nggunakake iterator:
| Iterator | kanggo loop |
|---|---|
|
|
Ya, luwih apik kanggo ngliwati unsur-unsur nggunakake ArrayListloop - kabeh dadi luwih cendhek.
Nanging pangripta Jawa maneh mutusaké kanggo pour sawetara gula ing kita. Untunge kanggo kita, iku gula sintaksis .
Padha menehi Jawa jinis loop anyar lan disebut loop for-each. Iki katon umume:
for(Type name:collection)
Where collectionjeneng variabel koleksi, Typejinis unsur ing koleksi, lan namejeneng variabel sing njupuk nilai sabanjuré saka koleksi ing saben pengulangan daur ulang.
Iki jenis loop iterates liwat kabeh unsur koleksi nggunakake iterator implisit. Iki cara kerjane:
| Kanggo-saben loop | Apa sing dideleng kompiler: Loop karo iterator |
|---|---|
|
|
Nalika kompiler nemoni for-eachloop ing kode sampeyan, mung ngganti kode kasebut ing sisih tengen: nambah telpon kanggo njaluk iterator bebarengan karo telpon metode liyane sing ilang.
Programer seneng for-eachdaur ulang lan meh tansah digunakake nalika kudu ngulang kabeh unsur koleksi.
Malah ngulang ArrayListdhaptar kanthi nggunakake for-eachloop katon luwih cendhek:
| Kanggo-saben loop | kanggo loop |
|---|---|
|
|
4. Njabut unsur ing for-eachdaur ulang
Daur for-eachulang nduweni siji kekurangan: ora bisa mbusak unsur kanthi bener. Yen sampeyan nulis kode kaya iki, sampeyan bakal entuk kesalahan.
| Kode | Cathetan |
|---|---|
|
Operasi mbusak bakal ngasilake kesalahan! |
Iki kode apik banget lan dingerteni, nanging ora bisa.
Sampeyan ora bisa ngganti koleksi nalika sampeyan ngliwati karo iterator.
Ana telung cara kanggo ngatasi watesan iki.
1. Gunakake jinis daur ulang sing beda
When traversing an ArrayList collection, sampeyan bisa nggunakake loop biasa karo ivariabel counter.
| Kode |
|---|
|
Nanging, pilihan iki ora cocok kanggo HashSetlan HashMapkoleksi
2. Gunakake iterator eksplisit
Sampeyan bisa nggunakake iterator kanthi tegas lan nelpon remove()metode kasebut.
| Versi sing bisa | Versi sing ora bisa |
|---|---|
|
|
Elinga yen kita nelpon remove()cara ing obyek iterator! Iterator ngerti yen item kasebut wis dibusak lan bisa nangani kahanan kasebut kanthi bener.
3. Gunakake salinan koleksi
Sampeyan uga bisa nggawe salinan koleksi banjur nggunakake salinan ing daur for-eachulang lan mbusak unsur saka koleksi asli.
| Kode | Cathetan |
|---|---|
|
Nggawe salinan koleksi gampang banget. Daur ulang nggunakake iterator kanggo salinan koleksi. Unsur dibusak saka listkoleksi. |
Koleksi kasebut disalin kanthi cepet, amarga unsur kasebut ora diduplikasi. Nanging, koleksi anyar nyimpen referensi kanggo unsur sing wis ana ing koleksi lawas.
GO TO FULL VERSION