det er to måter å fjerne objekter Fra ArrayList I Java, først ved å bruke remove () – metoden, og andre ved å bruke Iterator. ArrayList gir overbelastet remove () – metode, en aksepterindeks for objektet som skal fjernes, dvs. Tommelfingerregel er, hvis du kjenner indeksen til objektet, bruk den første metoden, ellers bruk den andre metoden. Forresten må du huske å bruke ArrayList fjern metoder, bare når du ikke itererer Over ArrayList hvis du itererer, bruk Iterator.fjern () – metoden, hvis du ikke gjør det, kan det føre Til ConcurrentModificationException I Java. En annen gotcha kan ha oppstått på grunn av autoboxing. Hvis du ser nøye på at to fjernmetoder, fjern(int index) og fjern(Object obj) er uutslettelige hvis du prøver å fjerne Fra En ArrayList Av Heltall.Anta at du har tre objekter I ArrayList, dvs. og du vil fjerne det andre objektet, som er 2. Du kan ringe fjern (2), som faktisk er et anrop for å fjerne(Objekt) hvis du vurderer autoboxing, men vil bli tolket som et anrop for å fjerne 3. element, ved å tolke som fjern (indeks).jeg har diskutert dette problemet tidligere i artikkelen min om beste praksis å følge mens overbelastningsmetoder i Java. På grunn av mindre kjent utvidelsesregel og autoboxing, kan dårlig overbelastet metode skape mye tvetydighet.
Kodeeksempel For Å Fjerne Elementer fra ArrayList
la oss teste over teori med et enkelt kodeeksempel På ArrayList med Heltall. Følgende program har En ArrayList Av Heltall som inneholder 1, 2 og 3, dvs. dette tilsvarer nøyaktig indeksen.
pakketest; importer java.util.Arraylist; importer java.util.http://java67.blogspot.com*/Offentlig Klasse JavaTutorial {/***@param args kommandolinjeargumentene * / offentlig statisk tomrom hoved(Streng args) { Liste<Heltall> tall=ny ArrayList<heltall> (); tall.legg til (1); tall.legg til (2); tall.legg til (3); System.ut.println ("ArrayList inneholder:" + tall); / / Ringer fjern (indeks) tall.fjern (1); / / fjerne objekt ved indeks 1, dvs. 2. Objekt, som er 2 / / Ringer fjern (objekt) tall.fjern (3);}} Utgang: ArrayList inneholder: Unntak i tråden" main " java.lang.IndexOutOfBoundsException: Indeks: 3, Størrelse: 2 på java.util.ArrayList.rangeCheck (ArrayList.java:635) på java.util.ArrayList.fjern (ArrayList.java:474) ved test.Test.hoved (Test.java:33) Java Resultat: 1
du kan se at andre samtalen er også behandlet som fjern (indeks). Den beste måten å fjerne tvetydighet er å ta ut autoboxing og gi et faktisk objekt, som vist nedenfor.
System.ut.println ("ArrayList Før:" + tall); / / Ringer fjern (indeks)tall.fjern (1); / / fjerne objekt ved indeks 1, dvs. 2. Objekt, som er 2 / / Ringer fjern (objekt)tall.fjern (nytt Heltall (3)); System.ut.println ("ArrayList Etter:" + tall);Utgang :ArrayList Før : ArrayList Etter :
Denne gangen virker det, men jeg er redd for lat utviklere som meg, som tar autoboxing gitt. La oss nå ta en titt på å fjerne objektet fra ArrayList mens Du Itererer over dem. Du må være kjent med Iterator I Java, før du fortsetter videre.
Fjern Objekt fra ArrayList ved Hjelp av Iterator
Dette er faktisk en subtil detalj Av Java programmering, ikke opplagt for første tidtakere, som kompilatoren vil ikke klage, selv om du bruker fjern() metode fra java.util.ArrayList, mens du bruker Iterator. Du vil bare innse din feil, når Du ser ConcurrentModificationException, som i seg selv er misvisende, og du kan tilbringe utallige timer å finne en annen tråd, som er å endre At ArrayList, På Grunn Av Samtidige ord. La oss se et eksempel.
offentlig statisk tomrom hoved(Streng args) { Liste<Heltall> tall = ny ArrayList<Heltall>(); tall.legg til( 101); tall.legg til (200); tall.legg til (301); tall.legg til (400); System.ut.println ("ArrayList Før:" + tall); Iterator<Integer> itr = numbers.iterator(); // remove all even numbers while (itr.hasNext()) { Integer number = itr.next(); if (number % 2 == 0) { numbers.remove(number); } } System.out.println("ArrayList After : " + numbers); }Output :ArrayList Before : 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 Testing.main(Testing.java:28)
Du Kan ConcurrentModificationException, grunn til å ringe for å fjerne () metode Fra ArrayList. Dette er enkelt i enkle eksempler som dette, men i ekte prosjekt kan det være veldig tøft. Nå, for å fikse dette unntaket, bare erstatte call of numbers.fjern() til itr.fjern (), dette vil fjerne gjeldende objekt du Itererer, som vist nedenfor:
System.ut.println ("ArrayList Før:" + tall);Iterator<Heltall> itr = tall.iterator (); / / fjern alle jevne numberswhile (itr.hasNext ()) { Heltall = itr.neste(); hvis (tall % 2 = = 0) {itr.fjern(); }}System.ut.println ("ArrayList Etter:" + tall);OutputArrayList Før: ArrayList Etter :
Det er alt på dette innlegget Om hvordan du fjerner objekt Fra ArrayList I Java. Vi har lært to måter å fjerne et objekt eller element fra ArrayList. Forresten, bør du alltid bruke fjern(indeks) for å slette objekt, hvis du ikke itererer, ellers bruk Alltid iterator ‘ s fjern() metode for å fjerne objekt fra ArrayList. Forresten ovenfor tips vil fungere med noen indeks basert liste implementering.
Videre Læring
Java I Dybden: Bli En Komplett Java Ingeniør Java Fundamentals: Samlinger Datastrukturer Og Algoritmer: Deep Dive Hjelp Java Algoritmer Og Datastrukturer-Del 1 og 2 Datastrukturer I Java 9 Av Heinz Kabutz