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
Type next()
Ngasilake unsur sabanjure ing koleksi
boolean hasNext()
Priksa manawa ana unsur sing durung dilewati
void remove()
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
HashSet<String> set = new HashSet<String>();

set.add("Hallo");
set.add("Hello");
set.add("Hola");
set.add("Bonjour");
set.add("Ciao");
set.add("Namaste");

Iterator<String> it = set.iterator();
while (it.hasNext())
{
   String str = it.next();
   System.out.println(str);
}
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
ArrayList<String> list = new ArrayList<String>();

Iterator<String> it = list.iterator();
while (it.hasNext())
{
   String str = it.next();
   System.out.println(str);
}
ArrayList<String> list = new ArrayList<String>();

for (int i = 0; i < list.size(); i++)
{
   String str = list.get(i);
   System.out.println(str);
}

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
ArrayList<String> list = new ArrayList<String>();

for (String str: list)
{
   System.out.println(str);
}
ArrayList<String> list = new ArrayList<String>();
Iterator<String> it = list.iterator();

while (it.hasNext())
{
   String str = it.next();
   System.out.println(str);
}

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
ArrayList<String> list = new ArrayList<String>();

for (String str: list)
{
   System.out.println(str);
}
ArrayList<String> list = new ArrayList<String>();

for (int i = 0; i < list.size(); i++)
{
   String str = list.get(i);
   System.out.println(str);
}


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
ArrayList<String> list = new ArrayList<String>();

list.add("Hallo");
list.add("Hello");
list.add("Hola");
list.add("Bonjour");
list.add("Ciao");
list.add("Namaste");

for (String str: list)
{
   if (str.equals("Hello"))
      list.remove(str);
}












Operasi mbusak bakal ngasilake kesalahan!

Iki kode apik banget lan dingerteni, nanging ora bisa.

Penting!

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
for (int i = 0; i < list.size(); i++)
{
   String str = list.get(i);

   if (str.equals("Hello"))
   {
      list.remove(str);
      i--; // We need to decrease i, because the remove operation shifted the elements
   }
}

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
Iterator<String> it = set.iterator();
while (it.hasNext())
{
   String str = it.next();
   if (str.equals("Hello"))
       it.remove();
}

for (String str: list) { if (str.equals("Hello")) list.remove(str); }

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
ArrayList<String> listCopy = new ArrayList(list);

for (String str: listCopy)
{
   if (str.equals("Hello"))
      list.remove(str);
}
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.