JavaRush /Java Blog /Random-TK /Java-daky ArrayList-den bir elementi aýyrmak

Java-daky ArrayList-den bir elementi aýyrmak

Toparda çap edildi
Salam! Iň soňky leksiýada “ArrayList” synpy bilen tanyşdyk we onuň bilen iň köp ýaýran amallary nädip ýerine ýetirmelidigini öwrendik. Mundan başga-da, “ArrayList” bilen yzygiderli massiwiň arasynda birnäçe tapawudy belledik. Indi “ArrayList” -den bir elementi aýyrmaga seredeliň. Elementleri yzygiderli tertipde pozmagyň gaty amatly däldigini öňem aýdypdyk. ArrayList-den bir elementi aýyrmak - 1Öýjügiň özüni pozup bilmeýändigimiz sebäpli, onuň bahasyny diňe “nol” edip bileris:
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 + '\'' +
               '}';
   }
}
Netije:

[Cat{name='Томас'}, null, Cat{name='Фorпп Маркович'}]
Emma täzeden düzülende massiwde “deşik” galýar. Öýjügi pozamzok, diňe mazmuny. 50 sany pişik bar bolsa, olaryň 17-sini şu görnüşde pozanymyzda näme boljagyny göz öňüne getiriň. 17 deşikli massiwimiz bolar we olara serediň! Täze gymmatlyklary ýazyp boljak boş öýjükleriň sanyny ýatdan ýatda saklamak mümkin däl. Bir gezek ýalňyşlyk goýberiň we obýekte islenýän salgylanma bilen öýjügiň üstünden ýazarsyňyz. Elbetde, muny birneme has ünsli ýerine ýetirmäge mümkinçilik bar: öçürilenden soň, massiwiň elementlerini başyna geçiriň, şonuň üçin “deşik” ahyrynda bolar:
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));
}
Netije:

[Cat{name='Томас'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}, null]
Indi has gowy görünýän ýaly, ýöne muny durnukly çözgüt diýip atlandyryp bolmaz. Iň bolmanda, her gezek massiwden bir element aýyranymyzda bu kody el bilen ýazmaly bolarys! Erbet wariant. Başga ýoldan gidip, aýratyn usul döredip bilersiňiz:
public void deleteCat(Cat[] cats, int indexToDelete) {
   //...remove the cat by index and shift the elements
}
Thisöne munuň hem peýdasy ýok: bu usul diňe obýektler bilen işläp biler Cat, ýöne beýlekiler bilen işleşip bilmez. .Agny, programmada massiwleri ulanmak isleýän ýene 100 synp bar bolsa, olaryň hersinde birmeňzeş logika bilen şol bir usuly ýazmaly bolarys. Bu düýbünden şowsuzlyk -_- Aröne ArrayList synpynda bu mesele üstünlikli çözülýär! Elementleri aýyrmak üçin ýörite usul ulanýar - 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());
}
Obýektimiziň indeksini usula geçirdik, ol pozuldy (edil bir massiwdäki ýaly). Usulyň remove()iki aýratynlygy bar. Birinjiden , “deşikleri” galdyrmaýar. Öň el bilen ýazan elementimizi ortadan aýyranyňyzda elementleri üýtgetmegiň logikasyny eýýäm durmuşa geçirýär . Konsoldaky öňki koduň çykyşyna serediň:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}]
[Cat{name='Томас'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}]
Bir pişigi ortadan aýyrdyk, beýlekileri boşluk bolmazlygy üçin aýlandy. Ikinjiden , bir obýekti diňe indeks boýunça (adaty massiw ýaly) däl, eýsem obýekte salgylanyp hem pozup biler :
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());
}
Netije:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}]
[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Пушок'}]
Islenýän obýektiň görkezijisini elmydama kelläňizde saklamak islemeýän bolsaňyz, bu gaty amatly bolup biler. Adaty öçürmegi düzen ýaly. Indi bu ýagdaýy göz öňüne getireliň: elementlerimiziň sanawyndan gaýtalap, belli bir at bilen pişigi aýyrmak isleýäris. Munuň üçin ýörite aýlaw operatory ulanýarys for- for each. Bu hakda has giňişleýin öwrenip bilersiňiz .
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);
}
Kod gaty mantykly ýaly bolup görünýär. Şeýle-de bolsa, netije sizi geň galdyryp biler:

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)
Bir hili ýalňyşlyk, näme üçin birden peýda bolandygy belli däl. Bu prosesde çözülmeli birnäçe nuans bar. Rememberatda saklamaly umumy düzgün: Kolleksiýa arkaly gaýtalap we şol bir wagtyň özünde elementlerini üýtgedip bilmersiňiz. Hawa, hawa, diňe bir pozmak däl-de, düýbünden üýtgeşiklik. Kodumyzda pişikleriň aýrylmagyny täzeleriniň goýulmagy bilen çalyşsaňyz, netije şol bir bolar:
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)
Bir amaly başga birine geçirdik, ýöne netije üýtgemedi: şol bir ýalňyşlyk ConcurrentModificationException. Düzgüni bozup, sanawy üýtgedip görenimizde takyk ýüze çykýar. Java-da, gaýtalama wagtynda elementleri aýyrmak üçin ýörite bir obýekt - iterator (synp) ulanmaly Iterator. Synp Iteratorelementleriň sanawyndan howpsuz gezmek üçin jogapkärdir. Bu gaty ýönekeý, sebäbi onuň diňe 3 usuly bar:
  • hasNext()- sanawda indiki elementiň bardygyna ýa-da iň soňkusyna ýetendigimize baglylykda truegaýdyp gelýär.false
  • next()- sanawyň indiki elementini görkezýär
  • remove()- sanawdan bir elementi aýyrýar
Görşüňiz ýaly, iterator sözme-söz biziň zerurlyklarymyza “laýyk gelýär” we bu barada çylşyrymly zat ýok. Mysal üçin, sanawymyzda aşakdaky elementiň bardygyny ýa-da ýokdugyny barlamak isleýäris, eger şeýle bolsa, ony konsola çap ediň:
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
}
Netije:

Cat{name='Томас'}
Cat{name='Бегемот'}
Cat{name='Фorпп Маркович'}
Cat{name='Пушок'}
Görşüňiz ýaly, synp ArrayListeýýäm iterator döretmek üçin ýörite usul ulanýar - iterator(). Şeýle hem, iterator döredilende, onuň işlejek obýektleriniň synpyny kesgitleýändigimize üns beriň ( <Cat>). Netijede, iterator ulanyp, asyl meselämizi aňsatlyk bilen çözüp bileris. Mysal üçin, “Filip Markowiç” atly pişigi ýok edeliň:
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);
Netije:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Пушок'}]
Element indeksini ýa-da iterator usulynda salgylanma üýtgeýän adyny görkezmändigimize göz ýetiren bolmagyňyz mümkin remove()! Iterator görünýäninden has akylly: usul remove()iterator tarapyndan yzyna gaýtarylan iň soňky elementi aýyrýar. Görşüňiz ýaly, zerur bolşy ýaly işledi :) Esasan elementleri aýyrmak barada bilmeli zatlaryňyz ArrayList. Has takygy - hemme zat diýen ýaly. Indiki leksiýada bu synpyň “iç taraplaryna” göz aýlarys we amallar wagtynda ol ýerde nämeleriň bolýandygyny göreris :) Görüşeris!
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION