Lista ja ArrayList Javassa
Aloitetaan johdatus List-tietorakenteeseen. Alla on vuokaavio, joka havainnollistaa kokoelmien ja listojen hierarkiaa. Kaavio voi vaikuttaa suurelta 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 periytyvät List-rajapinnasta, voit luoda olioita käyttämällä ylärajapintaa. Palaamme tähän tarkemmin myöhemmin.
Keskustellaan nyt ensimmäisestä listatyypistä – ArrayList.
Yllä näet syntaksin ArrayList<>-olion luomiseksi. Siinä on yksi osa, joka saattaa olla sinulle vieras – generics eli yleistyypit. Käsittelemme generics-ominaisuutta ja sen luomista myöhemmin.
Muista nyt, 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 muutama olio 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:aa, se tuo nämä kirjastot automaattisesti, joten sinun ei tarvitse huolehtia siitä.
Seuraavaksi tarkastellaan esimerkkiä, jossa luodaan lista 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 huomaat, 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? Tämä onnistuu käyttämällä asList()-luokan Arrays-metodia.
Tämän metodin avulla voidaan luoda lista, joka sisältää samat alkiot kuin alkuperäinen taulukko. Tämä on erityisen hyödyllistä, kun halutaan 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 perus-listametodit. Tähän asti listat olisi voinut helposti korvata taulukoilla, mutta tässä on keskeinen 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 paikan oikealle tehdäkseen tilaa uudelle alkiolle.
Esimerkiksi, jos lisäät alkion listan alkuun, kaikki olemassa olevat alkiot siirtyvät yhden paikan 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 läsnä 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 prosessin voi muuten yksinkertaistaa merkittävästi 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 koodistamme helposti laajennettavan—voit yksinkertaisesti lisätä lisää 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, tarvitsemme toisen tavan 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äsitellyt 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ä pohjassa (Ctrl Windowsissa) ja napsauttamalla ArrayList. Näin näet kaikki luokan kentät ja metodit, mikä auttaa sinua tutkimaan mahdollisesti ohittamiasi metodeja.
1. Millä metodilla voimme lisätä alkion indeksin perusteella?
2. Millä metodilla voimme hakea alkion indeksin perusteella?
3. Mitä metodia voidaan käyttää poistamaan alkion ensimmäinen esiintymä?
4. Mitä metodia voidaan käyttää korvaamaan alkio indeksin perusteella?
5. Mitä metodia voidaan käyttää tarkistamaan alkion olemassaolo?
6. Voimmeko luoda listan taulukosta?
7. Kuinka voimme luoda listan taulukosta?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Mahtavaa!
Completion arvosana parantunut arvoon 4
Lista ja ArrayList Javassa
Pyyhkäise näyttääksesi valikon
Aloitetaan johdatus List-tietorakenteeseen. Alla on vuokaavio, joka havainnollistaa kokoelmien ja listojen hierarkiaa. Kaavio voi vaikuttaa suurelta 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 periytyvät List-rajapinnasta, voit luoda olioita käyttämällä ylärajapintaa. Palaamme tähän tarkemmin myöhemmin.
Keskustellaan nyt ensimmäisestä listatyypistä – ArrayList.
Yllä näet syntaksin ArrayList<>-olion luomiseksi. Siinä on yksi osa, joka saattaa olla sinulle vieras – generics eli yleistyypit. Käsittelemme generics-ominaisuutta ja sen luomista myöhemmin.
Muista nyt, 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 muutama olio 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:aa, se tuo nämä kirjastot automaattisesti, joten sinun ei tarvitse huolehtia siitä.
Seuraavaksi tarkastellaan esimerkkiä, jossa luodaan lista 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 huomaat, 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? Tämä onnistuu käyttämällä asList()-luokan Arrays-metodia.
Tämän metodin avulla voidaan luoda lista, joka sisältää samat alkiot kuin alkuperäinen taulukko. Tämä on erityisen hyödyllistä, kun halutaan 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 perus-listametodit. Tähän asti listat olisi voinut helposti korvata taulukoilla, mutta tässä on keskeinen 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 paikan oikealle tehdäkseen tilaa uudelle alkiolle.
Esimerkiksi, jos lisäät alkion listan alkuun, kaikki olemassa olevat alkiot siirtyvät yhden paikan 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 läsnä 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 prosessin voi muuten yksinkertaistaa merkittävästi 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 koodistamme helposti laajennettavan—voit yksinkertaisesti lisätä lisää 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, tarvitsemme toisen tavan 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äsitellyt 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ä pohjassa (Ctrl Windowsissa) ja napsauttamalla ArrayList. Näin näet kaikki luokan kentät ja metodit, mikä auttaa sinua tutkimaan mahdollisesti ohittamiasi metodeja.
1. Millä metodilla voimme lisätä alkion indeksin perusteella?
2. Millä metodilla voimme hakea alkion indeksin perusteella?
3. Mitä metodia voidaan käyttää poistamaan alkion ensimmäinen esiintymä?
4. Mitä metodia voidaan käyttää korvaamaan alkio indeksin perusteella?
5. Mitä metodia voidaan käyttää tarkistamaan alkion olemassaolo?
6. Voimmeko luoda listan taulukosta?
7. Kuinka voimme luoda listan taulukosta?
Kiitos palautteestasi!