2 måder at fjerne elementer/objekter fra ArrayList i Java

der er to måder at fjerne objekter fra ArrayList i Java, for det første ved hjælp af fjern () – metoden og for det andet ved hjælp af Iterator. ArrayList giver overbelastet fjerne () metode, en acceptere indeks af objektet, der skal fjernes, dvs.fjerne(int indeks), og andre acceptere objekt, der skal fjernes, dvs. fjerne(Object). Tommelfingerregel er, hvis du kender objektets indeks, så brug den første metode, ellers brug den anden metode. Af den måde, skal du huske at bruge ArrayList fjerne metoder, kun når du ikke iterere løbet ArrayList hvis du iterere derefter bruge Iterator.fjern () metode, hvis du ikke gør det, kan det resultere i samtidig ændring af undtagelse i Java. En anden gotcha kan have fundet sted på grund af autoboksning. Hvis du ser nøje, at to fjern metoder, fjern (int indeks) og fjern(Object obj) kan ikke skelnes, hvis du forsøger at fjerne fra en ArrayList af heltal.
Antag, at du har tre objekter i ArrayList, dvs. og du vil fjerne det andet objekt, som er 2. Du kan ringe til Fjern (2), som faktisk er et opkald til at fjerne(objekt), hvis du overvejer autoboksning, men vil blive fortolket som et opkald til at fjerne 3.element ved at fortolke som Fjern(indeks).
jeg har diskuteret dette problem tidligere i min artikel om bedste praksis, der skal følges, mens overbelastningsmetoder i Java. På grund af mindre kendt udvidelse regel og autoboksning, Dårligt overbelastet metode kan skabe en masse tvetydighed.

kodeeksempel for at fjerne elementer fra ArrayList

lad os teste ovenstående teori med et simpelt kodeeksempel på ArrayList med heltal. Følgende program har en ArrayList af heltal, der indeholder 1 , 2 og 3 dvs.dette svarer nøjagtigt til indekset.

 pakke test;import java.util.ArrayList; import java.util.Liste;/** * * @forfatter http://java67.blogspot.com */offentlig klasse JavaTutorial{ /** * @param args kommandolinjeargumenterne */ offentlig statisk ugyldig hoved(String args) { List<heltal> numbers = ny ArrayList<heltal>(); tal.tilføje (1); numre.tilføje (2); numre.tilføje (3); System.uden.println ("ArrayList indeholder:" + numre); // opkald fjern (indeks) numre.fjern (1); //Fjernelse af objekt ved indeks 1, dvs.2. objekt, som er 2 //opkald fjern(objekt) numre.Fjern (3);}} Output:ArrayList indeholder : undtagelse i tråd "main" java.lang.Indeksoutofboundsundtagelse: indeks: 3, Størrelse: 2 på java.util.ArrayList.rangeCheck (ArrayList.java:635) på java.util.ArrayList.fjern (ArrayList.java:474) ved test.Test.vigtigste (prøve.java: 33) Java resultat: 1

Du kan se, at andet opkald også behandles som Fjern(indeks). Den bedste måde at fjerne tvetydighed på er at tage autoboksning ud og give et faktisk objekt, som vist nedenfor.

 System.uden.println ("ArrayList før:" + numre);// opkald fjern (indeks)numre.fjern (1); //Fjernelse af objekt ved indeks 1, dvs.2. objekt, som er 2 //opkald fjern(objekt) numre.fjern (nyt heltal (3)); System.uden.println("ArrayList efter :" + numbers);Output :ArrayList før : ArrayList efter : 

denne gang virker det, men jeg er bange for dovne udviklere som mig, som tager autoboksning givet. Lad os nu se på at fjerne objektet fra ArrayList, mens vi gentager dem. Du skal være bekendt med Iterator i Java, før du fortsætter videre.

Fjern objekt fra ArrayList ved hjælp af Iterator

2 eksempel for at fjerne elementer/objekter fra ArrayList i Javadette er faktisk en subtil detalje af Java-Programmering, ikke indlysende for første timere, da kompilatoren ikke vil klage, selvom du bruger fjern () – metoden fra java.util.ArrayList, mens du bruger Iterator. Du vil kun indse din fejl, når du ser Samtidigmodifikationsundtagelse, som i sig selv er vildledende, og du kan bruge utallige timer på at finde en anden tråd, som ændrer den ArrayList på grund af samtidig ord. Lad os se et eksempel.

offentlig statisk void main(String args) { List<heltal> numbers = ny ArrayList<heltal>(); numre.tilføje (101); numre.tilføje (200); numre.tilføje (301); numre.tilføje (400); System.uden.println ("ArrayList før:" + tal); 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 samtidig Modificeringsundtagelse på grund af opkald til fjernelse () metode fra ArrayList. Dette er let i enkle eksempler som dette, men i det virkelige projekt kan det være virkelig hårdt. For at løse denne undtagelse skal du bare erstatte opkald af numre.fjern () til itr.fjern (), dette fjerner det aktuelle objekt, du gentager, som vist nedenfor :

System.uden.println ("ArrayList før :" + tal); Iterator<heltal> itr = tal.Iterator (); / / fjern alle lige talmens (itr.hasnæste ()) { heltal = itr.næste(); hvis (nummer % 2 = = 0) {itr.fjern ();}} System.uden.println("ArrayList After :" + numbers);OutputArrayList før : ArrayList After : 

Det er alt på dette indlæg om, hvordan du fjerner objekt fra ArrayList i Java. Vi har lært to måder at fjerne et objekt eller element fra ArrayList. Forresten skal du altid bruge Fjern(indeks) for at slette objekt, hvis du ikke gentager, ellers skal du altid bruge Iterator ‘ s Fjern() metode til at fjerne objekt fra ArrayList. Af den måde ovenstående tips vil arbejde med enhver indeks baseret liste implementering.
yderligere læring
Java i dybden: Bliv en komplet Java ingeniør
Java Fundamentals:samlinger
datastrukturer og algoritmer: Deep Dive ved hjælp af Java
algoritmer og datastrukturer-Del 1 og 2
datastrukturer i Java 9

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.