Lista ja ArrayList Javassa
Pyyhkäise näyttääksesi valikon
Aloitetaan johdatus List-tietorakenteeseen. Alla on vuokaavio, joka havainnollistaa kokoelmien ja listojen hierarkiaa. Kaavio saattaa vaikuttaa laajalta ja monimutkaiselta, mutta käymme sen läpi vaihe vaiheelta.
Tässä osiossa tutustut erityiseen kokoelmatyyppiin, nimeltään listat. Tarkastelet tarkemmin erilaisia listatyyppejä, kuten ArrayList, LinkedList ja Stack.
Koska kaikki listat perivät List-rajapinnan, voit luoda olioita käyttämällä yläluokan rajapintaa. Palaamme tähän tarkemmin myöhemmin.
Keskitytään nyt ensimmäiseen listatyyppiin – ArrayList.
Yllä näet syntaksin ArrayList<>-olion luomiseksi. Saattaa olla osa, joka ei ole entuudestaan tuttu – generics eli yleismallityypit. Käsittelemme generics-ominaisuutta ja sen luomista myöhemmin.
Muista tässä vaiheessa, että kun luot ArrayList-olion, määrittelet tietotyypin kulmasulkeiden sisään. Huomioi myös, että listat eivät voi käyttää primitiivisiä tietotyyppejä. Sen sijaan käytetään wrapper-luokkia.
Seuraavaksi luodaan lista koodissa ja lisätään siihen muutamia olioita add()-metodilla.
Main.java
1234567891011121314package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numberList = new ArrayList<>(); numberList.add(10); numberList.add(15); numberList.add(5); System.out.println(numberList); } }
Kuten huomaat, add()-metodi on hyvin yksinkertainen—se lisää annetun arvon listaan.
Muista myös, että sinun täytyy importoida List ja ArrayList java.util-kirjastosta. Jos kuitenkin käytät IntelliJ IDEA:ta, se tuo nämä kirjastot automaattisesti, joten sinun ei tarvitse huolehtia siitä.
Seuraavaksi tarkastellaan esimerkkiä listan luomisesta omalla tietotyypillämme:
Main.java
1234567891011121314151617181920212223242526272829303132333435package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); List<Dog> dogList = new ArrayList<>(); dogList.add(bob); dogList.add(ben); dogList.add(brian); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
Kuten näet, loimme oman Dog-luokan ja ArrayList-kokoelman käyttäen tätä tietotyyppiä. Kun tulostimme listan, se näytti kaikki siihen tallennetut oliot.
Entä jos sinulla on taulukko ja haluat muuntaa sen listaksi? Voit tehdä tämän käyttämällä asList()-luokan Arrays-metodia.
Tämä metodi mahdollistaa listan luomisen, joka sisältää samat alkiot kuin alkuperäinen taulukko. Se on erityisen hyödyllinen, kun haluamme käyttää listan metodeja taulukkoon. Syntaksi on yksinkertainen:
Arrays.asList(arrayName);
Ja voit käyttää sitä suoraan uuden listan alustuksessa, esimerkiksi:
Main.java
12345678910111213141516171819202122232425262728293031323334package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); Dog[] dogs = {bob, ben, brian}; List<Dog> dogList = new ArrayList<>(Arrays.asList(dogs)); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
Samalla tavalla kuin voit muuntaa taulukon listaksi, voit myös muuntaa listan taulukoksi käyttämällä toArray()-metodia.
ArrayList<>-metodit
Käydään läpi peruslistametodit. Tähän asti listat olisi voinut helposti korvata taulukoilla, mutta tässä on olennainen ero—metodit.
add()-metodi on ylikuormitettu metodi, eli sillä on useita muunnelmia. Yksi niistä mahdollistaa alkion lisäämisen tiettyyn indeksiin.
Kun lisäät alkion listan keskelle, kaikki oikealla olevat alkiot siirtyvät yhden sijainnin oikealle tehdäkseen tilaa uudelle alkiolle.
Jos esimerkiksi lisäät alkion listan alkuun, kaikki olemassa olevat alkiot siirtyvät yhden sijainnin oikealle.
Tarkastellaan esimerkkiä:
Main.java
123456789101112131415161718package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 5; i++) { // Filling `numbers` list with 5 values numbers.add(i); } System.out.println("`numbers` before modifying: " + numbers); numbers.add(2, 10); // Adding 10 on the second index System.out.println("`numbers` after first modifying: " + numbers); numbers.add(0, 5); System.out.println("`numbers` after second modifying: " + numbers); } }
Arvojen siirtymistä elementtiä lisättäessä voidaan havainnollistaa seuraavalla kuvalla:
Alkioiden hakeminen
Jos voit lisätä olioita listaan tiettyyn indeksiin, voit myös hakea olioita niiden indeksin perusteella käyttämällä get(int index) -metodia.
Tarkastellaan esimerkkiä:
Main.java
12345678910111213141516171819package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("Alice"); names.add("Bob"); names.add("Charlie"); names.add("David"); names.add("Eva"); // Retrieving element by index String element = names.get(2); // Retrieving the 3rd element (index starts from 0) System.out.println("The element at index 2 is: " + element); } }
Alkioiden poistaminen
Voit lisätä, voit hakea, mutta voitko poistaa?
Totta kai! Voit poistaa alkioita käyttämällä remove(int index) -metodia.
Tämä metodi on myös ylikuormitettu, eli on olemassa toinenkin tapa poistaa alkio. Voit käyttää remove(Object obj) -metodia, joka poistaa ensimmäisen esiintymän annetusta alkiosta.
Kuvitellaanpa, että sinulla on suuri lista kaikista kurssimme opiskelijoista. Kuitenkin yksi opiskelija käyttäytyi huonosti ja erotettiin. Et tiedä hänen tarkkaa indeksiään, joten sinun täytyy poistaa hänet nimen perusteella. Mutta tässä on haaste—koodi on hieman rikki, ja hänen nimensä saattaa esiintyä useita kertoja listassa.
Kirjoitetaan ohjelma, joka poistaa kaikki tämän opiskelijan esiintymät listasta:
Main.java
123456789101112131415161718package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // Expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); while (students.contains("Bob")) { students.remove("Bob"); } System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }
Olet ehkä huomannut, että käytimme toista listan metodia—contains(Object obj). Tämä metodi tarkistaa, onko määritetty alkio listassa, ja palauttaa true tai false.
Käyttämällä contains()-metodia asetamme ehdon while-silmukalle, jolloin voimme poistaa kaikki opiskelijan, kuten "Bob", esiintymät listasta.
Tämän voi muuten tehdä huomattavasti helpommin käyttämällä removeAll(Collection<?> c) -metodia:
Main.java
123456789101112131415161718package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // Expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); List<String> expelledStudents = new ArrayList<>(); expelledStudents.add("Bob"); students.removeAll(expelledStudents); System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }
Metodi removeAll() ottaa kokoelman parametrina, joka sisältää arvot, jotka poistetaan listasta, jolle metodia kutsutaan.
Tässä lähestymistavassa loimme kokoelman erotetuista opiskelijoista ja lisäsimme siihen "Bobin". Tämä tekee koodista helposti laajennettavan—voit lisätä uusia häiriköitä erotettujen opiskelijoiden listaan ajan myötä.
Arvon päivittäminen indeksin perusteella
Palataan takaisin listan metodeihin—nyt vuorossa on päivitysmetodi.
Koska add()-metodi vain siirtää kaikki alkiot oikealle lisättäessä uusi arvo, tarvitaan eri tapa päivittää olemassa oleva arvo indeksin perusteella.
Metodi set(int index, Object value) tekee juuri tämän:
Main.java
12345678910111213141516package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> example = new ArrayList<>(); for (int i = 1; i <= 5; i++) { example.add(i); } System.out.println("List before modification: " + example); example.set(2, 28); System.out.println("List after modification: " + example); } }
Tämä on varsin yksinkertaista—korvasimme toisessa indeksissä olevan alkion luvulla 28.
Muut metodit
Olet jo käynyt läpi yleisimmät metodit, mutta niitä on paljon enemmän. Koska niitä käytetään harvoin, emme keskity jokaiseen erikseen.
Sen sijaan löydät kaikki tarvitsemasi metodit — sekä täydellisen dokumentaation ja yksityiskohtaiset selitykset — avaamalla ArrayList-luokan IntelliJ IDEA -ohjelmassa.
Voit tehdä tämän tuomalla ensin ArrayList-kirjaston, pitämällä Command key-näppäintä (Ctrl Windowsissa) pohjassa ja klikkaamalla ArrayList-luokkaa. Näin näet kaikki luokan kentät ja metodit, mikä auttaa sinua tutkimaan mahdollisesti ohittamiasi metodeja.
1. Mitä metodia voidaan käyttää alkion lisäämiseen tiettyyn indeksiin?
2. Mitä metodia voidaan käyttää alkion hakemiseen indeksin perusteella?
3. Mitä metodia voidaan käyttää ensimmäisen esiintymän poistamiseen?
4. Mitä metodia voidaan käyttää alkion korvaamiseen indeksin perusteella?
5. Mitä metodia voidaan käyttää tarkistamaan, onko alkio olemassa?
6. Voimmeko luoda listan taulukosta?
7. Miten voimme luoda listan taulukosta?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme