on kaksi tapaa poistaa esineitä Arraylistista Javassa, ensimmäinen, remove () – menetelmällä ja toinen käyttämällä Iteraattoria. ArrayList tarjoaa ylikuormitetun poista () – menetelmän, yhden poistettavan objektin hyväksymisindeksin eli poista(int-indeksi) ja toisen poistettavan objektin hyväksymisindeksin eli poista (OBJ). Nyrkkisääntö on, että jos tiedät kohteen indeksin, käytä ensimmäistä menetelmää, muuten käytä toista menetelmää. Muuten, sinun täytyy muistaa käyttää ArrayList poista menetelmiä, vain silloin, kun et iteroi yli ArrayList jos iteroit sitten käyttää Iteraattoria.poista () menetelmä, Jos näin ei tehdä, voi johtaa samanaikaiseen Modificationexception Java. Toinen gotcha on voinut tapahtua johtuen autoboxing. Jos katsot tarkasti, että kaksi poista menetelmiä, poista (int indeksi) ja poista(OBJ) ovat erottamattomia, jos yrität poistaa ArrayList kokonaislukuja.
Oletetaan, että sinulla on Arraylistissa kolme objektia eli haluat poistaa toisen objektin, joka on 2. Voit kutsua remove(2), joka on itse asiassa kutsu poistaa(objekti), jos tarkastellaan autoboxing, mutta tulkitaan kutsu poistaa 3rd Elementti, tulkitsemalla poista(indeksi).
olen käsitellyt tätä ongelmaa aiemmin artikkelissani parhaista käytännöistä, joita kannattaa noudattaa Ylikuormitusmenetelmien käytössä Java-kielellä. Koska vähemmän tunnettu Levenevä sääntö ja autoboksaus, huonosti ylikuormitettu menetelmä voi luoda paljon epäselvyyttä.
koodiesimerkki elementtien poistamiseksi Arraylistista
kokeillaan yllä olevaa teoriaa yksinkertaisella koodiesimerkillä Arraylististä kokonaislukujen kanssa. Seuraava ohjelma on ArrayList kokonaislukuja sisältävät 1, 2 ja 3 eli tämä vastaa täsmälleen indeksi.
pakettitesti;tuo java.util.ArrayList; tuo java.util.List;/** * * @author http://java67.blogspot.com */public class JavaTutorial {/**@param args komentoriviargumentit * / public static void main(String args) { List<Integer> numbers = new ArrayList<kokonaisluku>(); numerot.lisää (1); numerot.lisää (2); numerot.lisää (3); järjestelmä.ulos.println ("ArrayList contains:" + numbers); // Calling remove (index) numbers.poista (1); //objektin poistaminen indeksissä 1 eli 2.objekti, joka on 2 //kutsuu poista(objekti) - numeroita.Poista (3); }}ulostulo:ArrayList sisältää : poikkeuksen säikeessä "main" java.lang.Hakemisto foundsexception: Index: 3, Koko: 2 Jaavalla.util.Arraylisti.rangeCheck(täsmennyssivujava: 635) Jaavalla.util.Arraylisti.poista (ArrayList.java: 474) testissä.Testi.main (testi.java: 33) Java Result: 1
voit nähdä, että toinen puhelu käsitellään myös nimellä remove(index). Paras tapa poistaa epäselvyys on ottaa pois autoboxing ja tarjota todellinen objekti, kuten alla.
järjestelmä.ulos.println ("ArrayList Before:" + numbers);// Calling remove(index) numbers.poista (1); //objektin poistaminen indeksissä 1 eli 2.objekti, joka on 2 //kutsuu poista(objekti) - numeroita.poista (Uusi kokonaisluku(3)); järjestelmä.ulos.println ("ArrayList After:" + numbers);Lähtö :ArrayList Before : ArrayList After :
tällä kertaa se toimii, mutta pelkään kaltaisiani laiskoja kehittäjiä, jotka ottavat autoboksauksen myönnettynä. Nyt Katsotaanpa poistaa objektin ArrayList samalla toistamalla niitä. Sinun täytyy tuntea iteraattori Java, ennen kuin jatkat pidemmälle.
Poista objekti Arraylistista Iteraattorilla
tämä on itse asiassa hienovarainen yksityiskohta Java-ohjelmoinnista, ei ilmeinen ensikertalaisille, koska kääntäjä ei valita, vaikka käytät poista () – menetelmää javasta.util.ArrayList, kun käytät Iteraattoria. Tulet vain tajuamaan virheesi, kun näet samanaikaisesti Modificationexception, joka itsessään on harhaanjohtava ja saatat viettää lukemattomia tunteja löytää toinen säie, joka muuttaa että ArrayList, koska samanaikaisesti sana. Katsotaanpa esimerkkiä.
public static void main(String args) { List<Integer> numbers = new ArrayList<Integer>(); numerot.lisää (101); numerot.lisää (200); numerot.add (301); numerot.lisää (400); järjestelmä.ulos.println ("ArrayList Before:" + numerot); 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)
voit samanaikaisesti Modificationexception, koska kutsu poistaa () menetelmä ArrayList. Tämä on helppoa tällaisissa yksinkertaisissa esimerkeissä, mutta oikeassa projektissa se voi olla todella vaikeaa. Nyt, korjata tämän poikkeuksen, vain korvata call of numbers.poista () ITR: ään.poista (), tämä poistaa nykyisen Iteroitavan kohteen, kuten alla on esitetty :
järjestelmä.ulos.println ("ArrayList Before:" + numbers);iteraattori<kokonaisluku> itr = numbers.iteraattori ();// poista kaikki parilliset numerot (itr.hasNext ()) {Integer number = itr.seuraava(); jos (numero % 2 = = 0) {itr.Poista ();}} järjestelmä.ulos.println ("ArrayList After:" + numbers);OutputArrayList Before : ArrayList After :
That ’ s all on this post about How to remove object from ArrayList in Java. Olemme oppineet kaksi tapaa poistaa esine tai elementti ArrayList. Muuten, sinun pitäisi aina käyttää Poista(indeksi) poistaa objektin, jos et iteroi, muuten aina käyttää iteraattorin poista() menetelmä poistaa objektin ArrayList. Muuten edellä vinkkejä toimii minkä tahansa indeksipohjaisen luettelon täytäntöönpanoa.
jatko-oppiminen
Java in-Depth: Become a Complete Java Engineer
Java Fundamentals: Collections
Data Structures and Algorithms: Deep Dive Using Java
Algorithms and Data Structures-Part 1 and 2
Data Structures in Java 9 by Heinz Kabutz