CodeGym /Blog Jawa /Acak /Mbusak unsur saka ArrayList
John Squirrels
tingkat
San Francisco

Mbusak unsur saka ArrayList

Diterbitake ing grup
Hi! Ing wulangan pungkasan, kita kenal karo ArrayListkelas kasebut, lan sinau carane nindakake operasi sing paling umum karo kelas iki. Kajaba iku, kita nuduhake sawetara beda antarane array ArrayListlan biasa. Nanging kita nyimpang siji topik, yaiku, carane mbusak unsur saka file ArrayList. Kita bakal ngrembug saiki. Mbusak unsur saka ArrayList - 1Kita wis kasebut yen mbusak unsur saka array biasa ora trep banget. Amarga kita ora bisa mbusak unsur kasebut, kita mung bisa "nol" (diset menyang null) 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("Behemoth");
       cats[2] = new Cat("Lionel Messi");

       cats[1] = null;

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

   
@Override
   public String toString() {
       return "Cat{" +
               "name='" + name + '\'' +
               '}';
   }
}
Output: [Cat{name='Thomas'}, null, Cat{name='Lionel Messi'}] Nanging nyetel unsur array dadi null ninggalake "bolongan". Kita durung mbusak posisi ing array, mung isine. Bayangake apa sing bakal kelakon yen kita duwe 50 kucing lan mbusak 17 kucing kanthi cara iki. Kita bakal duwe array kanthi 17 bolongan. Cukup nyoba nglacak wong-wong mau! Ora realistis kanggo ngelingi jumlah sel kosong sing bisa nulis nilai anyar. Yen sampeyan salah, sampeyan bakal nimpa referensi obyek sing dikarepake. Mesthi wae, ana cara kanggo nindakake iki kanthi luwih ati-ati: sawise ngilangi unsur, pindhah unsur menyang ngarep array kanggo nyelehake "bolongan" ing pungkasan:

public static void main(String[] args) {

   Cat[] cats = new Cat[4];
   cats[0] = new Cat("Thomas");
   cats[1] = new Cat("Behemoth");
   cats[2] = new Cat("Lionel Messi");
   cats[2] = new Cat("Fluffy");

   cats[1] = null;

   for (int i = 2; i < cats.length-1; i++) {
       cats [i-1] = cats [i];// Move the elements to the front of the array, so the empty position is at the end
   }

   System.out.println(Arrays.toString(cats));
}
Output: [Cat{name='Thomas'}, Cat{name='Fluffy'}, Cat{name='Fluffy'}, null] Iki katon luwih apik, nanging meh ora bisa diarani solusi sing kuat. Yen ora ana alesan liyane saka kasunyatan sing kita kudu nulis kode iki saben-saben nalika mbusak unsur saka Uploaded! Iki minangka pilihan sing ala. Kita bisa pindhah cara liya lan nggawe cara sing kapisah:

public void deleteCat(Cat[] cats, int indexToDelete) {
   //...delete the cat corresponding to the index and move the elements
}
Nanging iki uga ora ana gunane: cara iki mung bisa digunakake karo Catobyek, nanging ora jinis liyane. Ing tembung liya, yen program duwe 100 kelas liyane sing pengin digunakake karo array, kita kudu nulis cara sing padha kanthi logika sing padha ing saben. Iki bencana total -_- Nanging ArrayListkelas ngatasi masalah iki! Iki 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("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);
   System.out.println(cats.toString());

   cats.remove(1);

   System.out.println(cats.toString());
}
Kita ngliwati indeks obyek menyang metode, sing mbusak (kaya ing array). Cara kasebut remove()nduweni rong fitur khusus. Kaping pisanan, ora ninggalake "bolongan". Wis ngetrapake logika sing dibutuhake kanggo mindhah unsur nalika unsur dicopot saka tengah, sing sadurunge kita tulis dhewe. Deleng output saka kode sadurunge:

[Cat{name='Thomas'}, Cat{name='Behemoth'}, Cat{name='Lionel Messi'}, Cat{name='Fluffy'}]

[Cat{name='Thomas'}, Cat{name='Lionel Messi'}, Cat{name='Fluffy'}]
Kita mbusak siji kucing saka tengah, lan liyane dipindhah supaya ora ana spasi kosong. Kapindho , bisa mbusak obyek ora mung kanthi indeks (kaya array normal), nanging uga kanthi referensi :

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);
   System.out.println(cats.toString());

   cats.remove(lionel);

   System.out.println(cats.toString());
}
Output: [Kucing{name='Thomas'}, Kucing{name='Behemoth'}, Kucing{name='Lionel Messi'}, Kucing{name='Fluffy'}] [Kucing{name='Thomas'}, Cat{name='Behemoth'}, Cat{name='Fluffy'}] Iki bisa uga trep yen sampeyan ora pengin tansah nglacak indeks obyek sing dikarepake. Kayane kita wis ngerti pambusakan biasa. Saiki ayo bayangake kahanan iki: kita pengin ngulang dhaptar lan mbusak kucing kanthi jeneng tartamtu . Kanggo nindakake iki, kita bakal nggunakake forloop cepet (uga disebut loop for-saben), sing dikenalake ing pelajaran Rishi:

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   for (Cat cat: cats) {

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

   System.out.println(cats);
}
Kode kasebut katon logis banget. Nanging asil bisa dadi kejutan gedhe: Pangecualian ing utas "utama" java.util.ConcurrentModificationException ing java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) ing java.util.ArrayList$Itr.next(ArrayList. java:831) ing Cat.main(Cat.java:25) Ana sawetara jenis kesalahan, lan ora jelas kenapa kedadeyan kasebut. Proses iki kalebu sawetara nuansa sing kudu ditangani. Punika aturan umum sampeyan kudu elinga: Sampeyan ora bisa bebarengan iterate liwat koleksi lan ngganti unsur sawijining. Lan tegese owah-owahan apa wae, ora mung mbusak. Yen sampeyan ngganti mbusak kucing kanthi nyoba nglebokake kucing anyar, asile bakal padha:

for (Cat cat: cats) {

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

System.out.println(cats);
Pangecualian ing utas "utama" java.util.ConcurrentModificationException ing java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) ing java.util.ArrayList$Itr.next(ArrayList.java:831) ing Cat.main( Cat.java:25) Kita ngganti siji operasi menyang liyane, nanging asil ora owah: kita njaluk padha ConcurrentModificationException . Iki kedadeyan nalika kita nyoba nglanggar aturan ing ndhuwur kanthi ngganti dhaptar nalika ngulang. Ing Jawa, kita butuh obyek khusus sing diarani iterator (Iteratorkelas) kanggo mbusak item nalika ngulang koleksi. KelasIteratortanggung jawab kanggo aman iterasi liwat dhaptar unsur. Iku cukup prasaja, amarga mung ana 3 cara:
  • hasNext()- ngasilake bener utawa salah, gumantung apa ana item sabanjuré ing dhaftar, utawa kita wis tekan pungkasan.
  • next()- ngasilake item sabanjuré ing dhaftar
  • remove()- mbusak item saka dhaftar
Nalika sampeyan bisa ndeleng, iterator digawe kanggo kabutuhan kita, lan ing wektu sing padha ora ana sing rumit. Upaminipun kita pengin mriksa apa ana unsur sabanjuré ing dhaftar kita, lan nuduhake yen ana:

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 the next element
   System.out.println(nextCat);// Display it
}
Output: Cat{name='Thomas'} Cat{name='Behemoth'} Cat{name='Lionel Messi'} Cat{name='Fluffy'} Kaya sing sampeyan deleng, wis ngetrapake cara khusus kanggo ArrayListnggawe pengulangan iterator():. Kajaba iku, elinga yen nalika nggawe iterator, kita nemtokake kelas obyek sing bakal digarap ( <Cat>). Intine yaiku iterator gampang nangani tugas asli kita. Contone, mbusak kucing sing jenenge "Lionel Messi":

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 the next element
   if (nextCat.name.equals("Lionel Messi")) {
       catIterator.remove();// Delete the cat with the specified name
   }
}

System.out.println(cats);
Output: [Cat{name='Thomas'}, Cat{name='Behemoth'}, Cat{name='Fluffy'}] Sampeyan bisa uga wis ngerti yen kita ora nemtokake indeks utawa jeneng ing remove()metode iterator. ! Iterator luwih pinter tinimbang sing katon: remove()mbusak unsur pungkasan sing bali dening iterator. Nalika sampeyan bisa ndeleng, iku mung apa kita wanted kanggo nindakake :) Ing asas, iki kabeh sing perlu kanggo ngerti bab njabut unsur saka ArrayList. Inggih, meh kabeh. Ing pawulangan sabanjuré, kita bakal katon ing kelas iki, lan ndeleng apa sing kedadeyan ana sajrone macem-macem panggilan metode :) Nganti saiki!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION