Listarakenne (ArrayList-luokka) Mikä on lista? Listan määrittely ArrayList-luokan metodeita Listan läpikäynti Listan läpikäynti indeksin avulla Listan läpikäynti iteraattorin avulla Listaan lisääminen Listasta poistaminen Listan kopiointi
Mikä on lista? Lista on tietorakenne, johon voidaan laittaa määrittelemätön määrä olioita. Lista poikkeaa taulukosta, siinä, että Listaan voidaan laittaa määrittelemäntön määrä olioita, taulukon koko määritellään, kun taulukko määritellään Taulukkoon voidaan sijoitta perustietotyyppisiä arvoja, listaan voidaan viedä vain olioita eli perustitetotyyppisten tilalle kääreluokkien olioita Esim. lista: Tyhjä lista, jossa on vain tunnussolmu lista: Lista, jossa on merkkijonoja Listan alkio/solmu, joka viittaa listaan tallennettuun olioon kissa koira 2
Listan määrittely Listan määrittely: List <E> lista = new ArrayList <E> ();, missä E on listaan tallettejen olioiden luokka Listan käyttö vaatii ohjelman alkuun: import java.util.list; import java.util.arraylist; 3
Listan määrittely jatkuu Lista, joka sisältää kokonaislukuja eli Integer-oliota: List <Integer> lukulista = new ArrayList<Integer>(); Lista,joka sisältää merkkijonoja eli String-olioita: List <String> merkkijonolista = new ArrayList<String> (); Lista, joika sisältää Tili-olioita: List <Tili> tilit= new ArrayList<Tili>(); 4
Esim. lista List <Integer> lista = new ArrayList <Integer>(); for (int i=1;i<5;i++) lista.add(i); // lisää olio listan loppuun lista: Listan solmu/alkio 1 2 3 4 Integer-olio 5
ArrayList-luokan metodeita: Esim. public int size() palauttaa listan koon eli listan alkioiden lukumäärän public E get(int i) Palauttaa listan alkiosta i viittaavan olion public boolean add( E olio) lisää alkion, joka viittaa olioon E, listan loppuun List <String> stringlista = new ArrayList <String> (); stringlista.add ("YKSI"); stringlista.add ("KAKSI"); stringlista.add ("KOLME"); for ( int i = 0 ; i < stringlista.size(); i++) { System.out.println ( stringlista.get(i) ); Tulostaa: YKSI KAKSI KOLME 6
ArrayList-luokan metodeita jatkuu public void clear() Tyhjentää listan public void add ( int i, E olio) Lisää alkion, joka viittaa olioon E, listan kohtaan i, aikaisemmin kohdassa i ollut alkio siirtyy kohtaan i+1, jne. public boolean isempty() Kertoo onko lista tyhjä 7
Esim. ArrayList-luokan metodeita jatkuu List <String> stringlista = new ArrayList <String> (); System.out.print("Mihin kohtaan lisäät (0 - " + ( stringlista.size()-1 ) + "):"); int index = input.nextint(); if (!lista.isempty && index >= 0 && index < stringlista.size()){ System.out.println("Anna merkkijono: "); Tulostaa: String mjono = input.next(); Mihin kohtaan lisäät (0-2): 0 Anna merkkijono: NOLLA stringlista.add (index, mjono); NOLLA YKSI KAKSI for ( int i = 0 ; i < stringlista.size(); i++) KOLME { System.out.println( stringlista.get(i) ); 8
ArrayList-luokan metodeita jatkuu public E set ( int i, E olio) Korvaa alkiosta i viittaavan olion parametrin oliolla Esim. List <String> stringlista = new ArrayList <String> (); System.out.println("Anna arvo, jonka haluat vaihtaa arvon " + stringlista.get(2) + " paikalle"); String mjono = input.next(); stringlista.set( 2, mjono); for ( int i = 0 ; i < stringlista.size(); i++) { System.out.println(stringLista.get(i)); Tulostaa: Anna arvo, jonka haluat vaihtaa arvon KAKSI paikalla: YKSIJAPUOLI NOLLA YKSI YKSIJAPUOLI KOLME 9
ArrayList-luokan metodeita jatkuu public int indexof (E olio) etsii listasta parametrissa välitettyä oliota ja palauttaa sen paikan/indeksin, jos sitä ei ole, paluuarvo on -1 String arvo = "YKSI"; int j ; j = stringlista.indexof(arvo); if (j!= -1) System.out.println( arvo + " on listassa kohdassa " + j); else System.out.println(arvo+ " ei ole"); tulostaa: YKSI ON listassa kohdassa 1 10
ArrayList-luokan metodeita jatkuu public E remove (int index) Esim. Poistaa listan alkion kohdasta index, palauttaa arvonaan olion, johon poistettu alkio viittasi System.out.println("Monesko alkio poistetaan listasta (0-" + (stringlista.size()-1) + "): "); int kohta = input.nextint(); if ( kohta >= 0 && kohta < stringlista.size()) { else Tulostaa String poistettu = stringlista.remove(kohta); System.out.println("poistetaan " + poistettu); System.out.println("VIRHE!"); Monesko alkio poistetaan listasta (0-3): 2 Poistetaan YKSIJAPUOLI 11
Listan läpikäynti Listarakenne tarvitsee usein käydä läpi alkio kerrallaan, esimerkiksi, kun Listan sisältö halutaan tulostaa muotoillusti Listasta halutaan etsiä tiettyä alkiota Lista halutaan järjestää Läpikäyntiin on kaksi tapaa: indekseihin perustuva ja iteraattorin avulla tehtävä 12
Listan läpikäynti indeksin avulla Indekseihin perustuva läpikäynti vastaa taulukon läpikäyntiä Esimerkiksi lista voidaan käydä läpi alusta loppuun ja tulostaa alkiot seuraavasti: List <Tuote> lista = new ArrayList<Tuote>(); // tulostan Tuotteet Tuote apu; for (int i = 0; i < lista.size(); i++) { apu = lista.get(i); System.out.println( apu.tostring() ); 13
Tuote-luokka public class Tuote { private int koodi; private String nimi; private double paino; private int varastomaara; public Tuote() { koodi = 0; nimi = null; paino = 0;varastoMaara = 0; public Tuote (int koodis, String nimis, double painos,int maaras){ koodi = koodis; nimi = nimis; paino = painos; varastomaara = maaras; public Tuote (String nimis, double painos,int maaras) { koodi = 0; nimi = nimis; paino = painos; varastomaara = maaras; // get ja set sekä tostring normaalisti 14
Listan läpikäynti iteraattorin avulla Lista voidaan käydä läpi myös iteraattorin avulla Javassa on myös rakenteita, joiden alkioita ei indeksoida juoksevalla numerolla. Tällaiset rakenteet, kuten HashMap on käytävä läpi iteraattorin avulla Läpikäynti iteraattorin avulla tehdään käyttämällä luokkaa Iterator Tarvitaan import java.util.iterator; 15
Iterator-luokan metodeita public boolean hasnext() Onko iteraattorin viittaama alkio listan viimeinen? public E next () Siirtää iteraattorin viittaamaan seuraavaa alkiota ja palauttaa ko. alkion viittaaman olion public void remove () Poistaa iteraattorin viittaaman alkion ArrayList- luokalla on käytettävissä metodi: public Iterator <E> iterator () Metodi palauttaa iteraattorin siten, että tämä viittaa listan tunnussolmuun 16
Iterator-esimerkki List <Tuote> lista = new ArrayList<Tuote>(); System.out.println("\nTUOTEET:"); Tuote apu; Iterator <Tuote> it = lista.iterator(); while (it.hasnext()){ apu = it.next(); System.out.println(apu.toString()); Tulostaa: TUOTEET: Koodi: 1, nimi: Vasara, paino: 2.4 kg, varastomaara: 3 kpl Koodi: 2, nimi: Meisseli, paino: 0.56 kg, varastomaara: 10 kpl Koodi: 3, nimi: Pora, paino: 2.56 kg, varastomaara: 2 kpl 17
Listaan lisääminen List <Tuote> lista = new ArrayList<Tuote>(); private void lisaatuotteet(){ Tuote tuote=null; int koodi; String nimi; double paino; int maara; System.out.println("Anna tuotteen koodi ( 0 lopettaa): "); koodi = input.nextint(); while ( koodi!= 0) { tuote = etsituote(koodi); // onko tuote jo lisätty? if (tuote== null){ // ei ole System.out.print("Anna tuotteen nimi:"); nimi = input.next(); System.out.print("Anna tuotteen paino ( kg): "); paino = input.nextdouble(); System.out.print("Anna tuotteen varastomäärä (kpl): "); maara = input.nextint(); tuote = new Tuote(koodi, nimi, paino, maara); // luo tuote-olio lista.add(tuote); // lisää tuote-olio listan loppuun else // tuote on jo lsätty System.out.println("Olet jo lisännyt tuotteen " + tuote); System.out.println("Anna tuotteen koodi ( 0 lopettaa): "); koodi = input.nextint(); 18
Listaan lisääminen List <Tuote> lista = new ArrayList<Tuote>(); jatkuu private Tuote etsituote (int koodi) { Tuote paluu = null, tuote; for (int i = 0; i < lista.size();i++) { tuote = lista.get(i); if (koodi == tuote.getkoodi()) { return paluu; paluu = tuote; break; // tuote löytyi // ulos silmukasta 19
Listasta poistaminen List <Tuote> lista = new ArrayList<Tuote>(); private void poistatuote () { Tuote tuote=null; int koodi; System.out.println("Anna tuotteen koodi, jonka haluat poistaa: "); koodi = input.nextint(); tuote = etsituote(koodi); if ( tuote!= null ) { else System.out.println("poistetaan tuote " + tuote); lista.remove ( tuote ); System.out.println("Ei löydy!"); 20
Listan kopioiminen List <Tuote> lista = new ArrayList<Tuote>(); Lista kopioidaan toiseen lista-olioon alkio kerrallaan private List<Tuote> kopioilista() { List <Tuote> kopio = new ArrayList <Tuote> (); Tuote tuote, apu; for ( int i = 0; i < lista.size(); i++) { apu = lista.get(i); tuote = new Tuote ( apu.getkoodi(), return kopio; apu.getnimi(), apu.getpaino(), apu.getvarastomaara()); kopio.add(tuote); // kopioi Tuote-olio // lisää tuote listaan 21
harjoitus Tee OppilasSovellus-luokka, joka tallentaa Oppilas-oliot ArrayListolioon. Ohjelman käyttöliittymä näyttää seuraavalta: 1) Lisää oppilas 2) Etsi oppilas 3) Poista oppilas 4) Tulosta oppilaat 0) Lopeta Valitse: Oppilas-luokka tehtiin edellisellä viikolla Kun käyttäjä valitsee 1) lisää oppilas, ohjelma pyytää oppilasnumeroa. Ohjelma tutkii, onko oppilas jo lisätty aikaisemmin ja ilmoittaa siitä, mikäli on. Jos oppilasnumeroa ei löydy, ohjelma pyytää oppilaan loput tiedot ja lisää Oppilas-olion listan loppuun. 22
Harjoitus jatkuu Jos käyttäjä valitsee 2) etsi oppilas, ohjelma pyytää päivämäärän ja etsii ja tulosta kaikkien niiden oppilaiden tiedot, joiden syntpvm on annettu päivämäärä. Jos käyttäjä valitsee 3) poista oppilas, ohjelma pyytää oppilasnumeron, etsii ko. oppilaan ja poistaa sen, jos löytää. Jos käyttäjä valitsee 4) tulosta oppilaat, ohjelma tulostaa kaikkien oppilaiden tiedot. 23
ratkaisu import java.text.parseexception; import java.text.simpledateformat; import java.util.date; import java.util.iterator; // Iterator<Oppilas> it import java.util.list; // List <Oppilas> lista; import java.util.scanner; import java.util.arraylist; // lista = new ArrayList<Oppilas>(); public class OppilasSovellus { private Scanner input; private List<Oppilas> lista; public OppilasSovellus(){ input = new Scanner(System.in); lista = new ArrayList<Oppilas>(); 24
Ratkaisu jatkuu public void aja(){ int valinta=-1; do { System.out.println("1) lisää oppilas"); System.out.println("2) etsi oppilas"); System.out.println("3) poista oppilas"); System.out.println("4) tulosta oppilaat"); System.out.println("0) lopeta"); System.out.print("valitse:"); valinta = input.nextint(); switch (valinta) { case 0: break; case 1: lisaaoppilas(); break; case 2: etsioppilas(); break; case 3: poistaoppilas(); break; case 4: tulostaoppilaat(); break; while (valinta!= 0); 25
Ratkaisu jatkuu private void lisaaoppilas(){ int numero; String etunimi, sukunimi; Date syntpvm; Oppilas oppilas; System.out.print("Anna oppilaan numero:"); numero = input.nextint(); oppilas = etsioppilas(numero); // onko oppilas jo lisätty? if ( oppilas == null){ else System.out.print("Anna oppilaan etunimi"); etunimi = input.next(); System.out.print("Anna oppilaan sukunimi"); sukunimi = input.next(); syntpvm = pyydapvm("anna oppilaan syntymäpäivämäärä"); // luo Oppilas-olio oppilas = new Oppilas (numero, etunimi, sukunimi, syntpvm); lista.add(oppilas); // lisää oppilas listan loppuun System.out.println("olet jo lisännyt oppilaan: " + oppilas.tostring()); 26
Ratkaisu jatkuu // metodi etsii oppilaan, jonka numero on sama kuin parametrin nro arvo private Oppilas etsioppilas(int nro){ Oppilas oppilas = null, paluu = null; for (int i = 0; i<lista.size();i++) { oppilas = lista.get(i); if ( nro == oppilas.getoppilasnro()){ return paluu; paluu = oppilas; // oppilas löytyi break; // ulos silmukasta 27
Ratkaisu jatkuu // metodi pyytää päivämäärän, pyyntöön kuuluva teksti annetaan parametrina private Date pyydapvm (String teksti){ Date pvm = null; SimpleDateFormat f = new SimpleDateFormat("dd.MM.yyyy"); String pvmstr; do { System.out.print(teksti + " muodossa pp.kk.vvvv: "); pvmstr=input.next(); try{ pvm = f.parse(pvmstr); // onnistuuko? catch (ParseException e) { pvm = null; while (pvm == null); return pvm; System.out.println("Virhe!"); 28
Ratkaisu jatkuu // metodi pyytää päivämäärän ja etsii ja tulosta kaikkien niiden oppilaiden tiedot, joiden syntpvm on annettu päivämäärä. private void etsioppilas(){ Oppilas oppilas; Date pvm = pyydapvm ("Anna päivämäärä"); Iterator<Oppilas> it = lista.iterator(); while (it.hasnext()) { oppilas = it.next(); // Date-luokan compareto-metodi palauttaa 0 jos pvm on // sama kuin oppilaan syntpvm if (pvm.compareto(oppilas.getsyntpvm()) == 0) { // löytyi System.out.println(oppilas.toString()); private void tulostaoppilaat(){ System.out.println("OPPILAAT:"); for (int i = 0; i<lista.size();i++) System.out.println(lista.get(i)); 29
Ratkaisu jatkuu private void poistaoppilas(){ int numero; Oppilas oppilas; System.out.print("Anna poistettavan oppilaan numero:"); numero = input.nextint(); oppilas = etsioppilas(numero); // onko oppilas listassa? if ( oppilas!= null) { else System.out.println("poistetaan oppilas " + oppilas.tostring()); lista.remove(oppilas); System.out.println("oppilasta " + numero + " ei ole"); public static void main(string[] args) { OppilasSovellus ohj = new OppilasSovellus(); ohj.aja(); 30