Listarakenne (ArrayList-luokka)

Samankaltaiset tiedostot
Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Rajapinta (interface)

YHTEYSSUHDE (assosiation)

Lista luokan sisällä

Java-kielen perusteet

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Metodien tekeminen Javalla

Luokan sisällä on lista

public static void main (String [] args)

Mikä yhteyssuhde on?

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Vahva koostumussuhde (Composition)

Olio-ohjelmointi Javalla

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Taulukoiden käsittely Javalla

Ohjelmoinnin jatkokurssi, kurssikoe

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Luokan muodostimet (Constructors)

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Java-kielen perusteita

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Ohjelmoinnin perusteet Y Python

Metodien tekeminen Javalla

1 Tehtävän kuvaus ja analysointi

KOHDELUOKAN MÄÄRITTELY

Java kahdessa tunnissa. Jyry Suvilehto

Periytyminen (inheritance)

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Java-kielen perusteita

Mitä poikkeuskäsittely tarkoittaa?

TIETORAKENTEET JA ALGORITMIT

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

Ohjelmoinnin perusteet, kurssikoe

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Standardi- ja tietorakenneluokkia

Ehto- ja toistolauseet

Ohjelmoinnin perusteet Y Python

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen

16. Javan omat luokat 16.1

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

14. Poikkeukset 14.1

Poikkeustenkäsittely

14. Poikkeukset 14.1

Java-kielen perusteet

Sisältö. 22. Taulukot. Yleistä. Yleistä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Javan GUI Scratchaajalle

7. Oliot ja viitteet 7.1

Java-kielen perusteet

Taulukot. Jukka Harju, Jukka Juslin

UML ja luokkien väliset suhteet

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Ohjelmoinnin peruskurssi Y1

Sisältö. 2. Taulukot. Yleistä. Yleistä

20. Javan omat luokat 20.1

Luokkakirjastot. esiintymämetodien käytöstä:

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

7. Näytölle tulostaminen 7.1

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

17. Javan omat luokat 17.1

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

18. Abstraktit tietotyypit 18.1

Ohjelmointityö 3. Mikko Laamanen

Taulukot. Taulukon käsittely. Tämän osan sisältö. Esimerkki. Taulukon esittely ja luonti. Taulukon alustaminen. Taulukon koko

Tietokannat II -kurssin harjoitustyö

Merkkijonon tutkiminen matches-metodilla

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

8. Näppäimistöltä lukeminen 8.1

Merkkien ja merkkijonojen käsittelyä Javalla

Java-kielen perusteita

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmointi 2 / 2010 Välikoe / 26.3

Yksikkötestaus. Kattava testaus. Moduulitestaus. Ohjelman testaus. yksikkotestaus/ Seija Lahtinen

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

12. Näppäimistöltä lukeminen 12.1

Ohjelmointi 2, välikoe

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Tietorakenteet, laskuharjoitus 8, malliratkaisut

1. Mitä tehdään ensiksi?

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Muuttujat ja kontrolli. Ville Sundberg

OHJ2k12 välikoe

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

TyontekijaOhjelma. +main() (käyttää) + = public - = private

Rinnakkaisohjelmointi, Syksy 2006

8. Näppäimistöltä lukeminen 8.1

Transkriptio:

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