JavaRush /Blog Jawa /Random-JV /Mbusak unsur saka ArrayList ing Jawa

Mbusak unsur saka ArrayList ing Jawa

Diterbitake ing grup
Hello! Ing kuliah pungkasan, kita kenal karo kelas ArrayList , lan uga sinau babagan cara nindakake operasi sing paling umum. Kajaba iku, kita wis nyorot sawetara beda antarane ArrayList lan array biasa. Saiki ayo goleki mbusak unsur saka ArrayList. Kita wis ujar manawa mbusak unsur ing array biasa ora trep banget. Mbusak unsur saka ArrayList - 1Amarga kita ora bisa mbusak sel kasebut, kita mung bisa "nol" regane:
public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Hippopotamus");
       cats[2] = new Cat("Philip Markovich");

       cats[1] = null;

       System.out.println(Arrays.toString(cats));
   }


@Override
   public String toString() {
       return "Cat{" +
               "name='" + name + '\'' +
               '}';
   }
}
Kesimpulan:

[Cat{name='Томас'}, null, Cat{name='Фorпп Маркович'}]
Nanging nalika ngreset, "bolongan" tetep ing array. Kita ora mbusak sel, nanging mung isi. Bayangake apa sing bakal kelakon yen kita duwe 50 kucing, 17 sing wis dibusak kanthi cara iki. Kita bakal duwe Uploaded karo 17 bolongan, lan katon sawise wong-wong mau! Ngelingi kanthi ati-ati nomer sel kosong sing bisa nulis nilai anyar ora realistis. Nggawe kesalahan sapisan lan sampeyan bakal nimpa sel kanthi referensi sing dikarepake kanggo obyek kasebut. Mesthi wae, ana kesempatan kanggo nindakake kanthi ati-ati: sawise mbusak, pindhahake unsur-unsur array menyang wiwitan, supaya "bolongan" ana ing pungkasan:
public static void main(String[] args) {

   Cat[] cats = new Cat[4];
   cats[0] = new Cat("Thomas");
   cats[1] = new Cat("Hippopotamus");
   cats[2] = new Cat("Philip Markovich");
   cats[3] = new Cat("Fluff");

   cats[1] = null;

   for (int i = 2; i < cats.length-1; i++) {
       //move the elements to the beginning so that the empty cell is at the end
       cats[i-1] = cats[i];
       cats[i] = null;
   }

   System.out.println(Arrays.toString(cats));
}
Kesimpulan:

[Cat{name='Томас'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}, null]
Saiki katon luwih apik, nanging meh ora bisa diarani solusi sing stabil. Paling ora, amarga kita kudu nulis kode iki kanthi tangan saben-saben mbusak unsur saka array! Pilihan ala. Sampeyan bisa pindhah cara liya lan nggawe cara sing kapisah:
public void deleteCat(Cat[] cats, int indexToDelete) {
   //...remove the cat by index and shift the elements
}
Nanging iki uga ora ana gunane: cara iki mung bisa digunakake karo obyek Cat, nanging ora bisa digunakake karo wong liya. Yaiku, yen ana 100 kelas liyane ing program sing pengin digunakake array, kita kudu nulis cara sing padha kanthi logika sing padha ing saben. Iki gagal lengkap -_- Nanging ing kelas ArrayList masalah iki kasil ditanggulangi! Iku nindakake cara khusus kanggo mbusak unsur - remove():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);
   System.out.println(cats.toString());

   cats.remove(1);

   System.out.println(cats.toString());
}
Kita ngliwati indeks obyek menyang metode kasebut, lan wis dibusak (kaya ing array). Cara kasebut remove()nduweni rong fitur. Kaping pisanan , ora ninggalake "bolongan". Iku wis ngleksanakake logika owah-owahan unsur nalika njabut unsur saka tengah, kang sadurunge kita nulis tangan. Deleng output kode sadurunge ing console:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}]
[Cat{name='Томас'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}]
Kita mbusak kucing siji saka tengah lan liyane dipindhah supaya ora ana celah. Kapindho , bisa mbusak obyek ora mung kanthi indeks (kaya array biasa), nanging uga kanthi referensi kanggo obyek :
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);
   System.out.println(cats.toString());

   cats.remove(philipp);

   System.out.println(cats.toString());
}
Kesimpulan:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}]
[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Пушок'}]
Iki bisa dadi trep banget yen sampeyan ora pengin tansah nyimpen indeks obyek sing dikarepake ing sirah. Kita koyone wis ngurutake pambusakan sing biasa. Saiki ayo bayangake kahanan iki: kita pengin ngulang dhaptar unsur lan mbusak kucing kanthi jeneng tartamtu. Iki digunakake operator daur ulang khusus for- for each. Sampeyan bisa sinau luwih akeh babagan iki ing kuliah iki .
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   for (Cat cat: cats) {

       if (cat.name.equals("Hippopotamus")) {
           cats.remove(cat);
       }
   }

   System.out.println(cats);
}
Kode kasebut katon cukup logis. Nanging, asil bisa kaget sampeyan:

Exception in thread "main" java.util.ConcurrentModificationException
  at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
  at java.util.ArrayList$Itr.next(ArrayList.java:831)
  at Cat.main(Cat.java:25)
Sawetara jenis kesalahan, lan iku ora cetha kok dumadakan katon. Ana sawetara nuansa ing proses iki sing kudu ditangani. A aturan umum sing kudu elinga: Sampeyan ora bisa iterate liwat koleksi lan ngganti unsur ing wektu sing padha. Ya, ya, persis owah-owahan, lan ora mung pambusakan. Yen sampeyan nyoba ing kode kita kanggo ngganti mbusak kucing karo nglebokake anyar, asil bakal padha:
for (Cat cat: cats) {

   cats.add(new Cat("Salem Saberhegen"));
}

System.out.println(cats);

Exception in thread "main" java.util.ConcurrentModificationException
  at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
  at java.util.ArrayList$Itr.next(ArrayList.java:831)
  at Cat.main(Cat.java:25)
Kita ngganti siji operasi menyang liyane, nanging asil ora owah: kesalahan sing padha ConcurrentModificationException. Iki kedadeyan nalika kita nyoba nglanggar aturan lan ngganti dhaptar nalika ngulang. Ing Jawa, kanggo mbusak unsur sajrone pengulangan, sampeyan kudu nggunakake obyek khusus - iterator (kelas Iterator). Kelas Iteratortanggung jawab kanggo mlaku kanthi aman ing dhaptar unsur. Iku cukup prasaja amarga mung ana 3 cara:
  • hasNext()- bali truesalah siji falsegumantung apa ana unsur sabanjuré ing dhaftar, utawa kita wis tekan pungkasan.
  • next()- ngasilake unsur sabanjuré dhaftar
  • remove()- mbusak unsur saka dhaftar
Minangka sampeyan bisa ndeleng, iterator secara harfiah "disesuaikan" kanggo kabutuhan kita, lan ora ana sing rumit. Contone, kita pengin mriksa manawa dhaptar kita ngemot unsur ing ngisor iki, lan yen ya, cetak menyang konsol:
Iterator<Cat> catIterator = cats.iterator();//create an iterator
while(catIterator.hasNext()) {//as long as there are elements in the list

   Cat nextCat = catIterator.next();//get next element
   System.out.println(nextCat);// print it to the console
}
Kesimpulan:

Cat{name='Томас'}
Cat{name='Бегемот'}
Cat{name='Фorпп Маркович'}
Cat{name='Пушок'}
Nalika sampeyan bisa ndeleng, kelas ArrayListwis ngleksanakake cara khusus kanggo nggawe iterator - iterator(). Uga, elinga yen nalika nggawe iterator, kita nemtokake kelas obyek sing bakal digunakake ( <Cat>). Pungkasane, kita bisa ngatasi masalah asli kanthi gampang nggunakake iterator. Contone, ayo mbusak kucing sing jenenge "Philip Markovich":
Iterator<Cat> catIterator = cats.iterator();//create an iterator
while(catIterator.hasNext()) {//as long as there are elements in the list

   Cat nextCat = catIterator.next();//get next element
   if (nextCat.name.equals("Philip Markovich")) {
       catIterator.remove();//delete the cat with the desired name
   }
}

System.out.println(cats);
Kesimpulan:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Пушок'}]
Sampeyan bisa uga wis ngelingi yen kita ora nemtokake indeks unsur utawa jeneng variabel referensi ing metode iterator remove()! Iterator luwih pinter tinimbang sing katon: metode kasebut remove()mbusak unsur pungkasan sing bali dening iterator. Nalika sampeyan bisa ndeleng, makarya persis minangka needed :) Sing Sejatine kabeh sing perlu kanggo ngerti bab njabut unsur saka ArrayList. Luwih tepat - meh kabeh. Ing kuliah sabanjuré kita bakal katon menyang "insides" saka kelas iki lan ndeleng apa mengkono ana sak operasi :) Ndeleng sampeyan!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION