Inf1000 (Uke 10) HashMap og ArrayList



Like dokumenter
Grunnkurs i programmering Institutt for Informatikk Universitetet i Oslo Are Magnus Bruaset og Anja Bråthen Kristoffersen

Bibliotekpakker i Java. Inf1000 (Uke 10) HashMap og ArrayList. Bibliotek. ArrayList

Bibliotekpakker i Java. Inf1000 (Uke 10) HashMap og ArrayList. ArrayList. Bibliotek. Klassen ArrayList fungerer nesten som vanlige array-er.

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

INF1000 Forelesning 9. Hashmap Eksempel: Flyreservasjon

HashMap. INF1000 Forelesning 9. Ulike versjoner i Java 1.4 (gammel) og Java 1.5/1.6 av HashMap. Objekter lagres med en søkenøkkel

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

Oversikt. INF1000 Uke 6. Objekter, pekere og null. Lese og skrive fra/til fil. Litt om objekter, pekere og null Filer og easyio. Litt mer om tekster

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

De neste ukene. INF1000 Uke 12. Prøveeksamen. Nå - Prøveeksamen. Forelesning om IT og samfunn neste uke (13/11).

INF1000 HashMap. Marit Nybakken 2. november 2003

Generelt om oblig 3. Oppgaveteksten kort sammendrag. Deloppgaver/menyvalg 15/03/2010. INF1000 Forelesning 9

UNIVERSITETET I OSLO

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

UNIVERSITETET I OSLO

INF Uke 10. Ukesoppgaver oktober 2012

Oblig4 - obligatorisk oppgave nr. 4 (av 4) i INF1000

Mål for INF1000. Repetisjon INF 1000 våren Representasjon av data. Programvareutvikling - oversikt

UNIVERSITETET I OSLO

INF1000 (Uke 6) Mer om metoder, tekster

Repetisjon INF 1000 våren 2006

Rep: Metoder. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. 3 typer variable: Klassevariable. Java-programmene så langt i kurset:

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

UNIVERSITETET I OSLO

INF1000 Behandling av tekster

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Løsningsforslag til eksamen i INF1000 våren 2006

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Repetisjon. INF gruppe 13

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

INF1000: Forelesning 10

UNIVERSITETET I OSLO

INF1000 : Forelesning 5

Oblig4 - forklaringer. Arne og Ole Christian

UNIVERSITETET I OSLO

Innlesning fra tastatur med easyio. INF1000 høst Vi må først skrive i toppen av programmet: import easyio.*;

Forelesning inf Java 5

Forelesning inf Java 5

INF1000: noen avsluttende ord

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

IN1010 våren januar. Objektorientering i Java

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

"Nelsons kaffebutikk"

UNIVERSITETET I OSLO

Gjennomgang av eksamen H99

INF1000 (Uke 4) Mer om forgreninger, While-løkker

INF Løsning på seminaropppgaver til uke 8

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

UNIVERSITETET I OSLO

Forelesning inf Java 4

UNIVERSITETET I OSLO

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Repetisjon. Mer om forgrening While-løkker

TOD063 Datastrukturer og algoritmer

Løse reelle problemer

Forelesning inf Java 5

Ole Christian Lingjærde, 12. september 2013

Blokker og metoder INF1000 (Uke 6) Metoder

Forelesning inf Java 4

UNIVERSITETET I OSLO

BOKMÅL Side 1 av 5. KONTERINGSEKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Onsdag 6. august 2008 Kl

Endret litt som ukeoppgave i INF1010 våren 2004

INF1000 Metoder. Marit Nybakken 16. februar 2004

Løsningsforslag, inf101, våren 2001

Introduksjon til objektorientert programmering

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000 (Uke 6) Mer om metoder, tekster

Eksamen høsten 2003 Den store bøygen i INF1000 er de obligatoriske oppgavene.

Orakeltjeneste på Abel Hjelp til Obligatorisk oppgave 2. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. Rep: Metoder

UNIVERSITETET I OSLO

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

(MVC - Model, View, Control)

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Tre måter å lese fra terminal.

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

UNIVERSITETET I OSLO

Oblig 4Hybelhus litt mer tips enn i oppgaven

UNIVERSITETET I OSLO

IN105-javaNelson-2. array, evt. flere dimensjoner. Institutt for informatikk Jens Kaasbøll sept En funksjon om gangen En klasse om gangen

INF1000 : Forelesning 4

Inf1000 (Uke 10) Oppgaveløsning. Hashmap

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

INF1000 (Uke 14) Resten av eksamen H03 + del av V05

Transkript:

Inf1000 (Uke 10) HashMap og ArrayList Grunnkurs i programmering Institutt for Informatikk Universitetet i Oslo Anja Bråthen Kristoffersen og Are Magnus Bruaset

Bibliotekpakker i Java Det er laget mange pakker i java hver av disse inneholder: klasser (In, Out, StringTokenizer, ) metoder (Math.random, outln, endoffile, nexttoken, ) evt. konstanter (Math.PI) Vi har hittil brukt metoder fra pakkene: easyio.* java.util.* Math.* 07.03.2005 2

Bibliotek Sun har laget en oversikt over alle tilgjengelige klasser og pakker i biblioteket: http://java.sun.com/j2se/1.4.2/docs/api/index.html For å hente inn de delene man trenger i programkoden fra biblioteket brukes import import java.util.* Vi skal i dag se på to av pakkene i java.util.* ArrayList HashMap 07.03.2005 3

ArrayList Klassen ArrayList fungerer nesten som vanlige array-er. Vi må hente inn klassen fra biblioteket: import java.util.arraylist; Objekter opprettes med new: ArrayList a = new ArrayList(); 07.03.2005 4

ArrayList: noen sentrale metoder Vi setter inn objekter med metoden add: a.add(p); //objektet p settes inn sist i listen a.add(n, p); //objektet p settes inn på indexplass n Vi får bare sette inn i posisjoner som er i bruk, eller én høyere! Vi henter elementer med metoden get: p = (MyClass) a.get(n); Vi må angi klassen til det objektet vi henter ut her indikert med (MyClass) som kan være f.eks. (String). Antall elementer i ArrayList a får man med metoden size: l = a.size(); 07.03.2005 5

ArrayList sammenliknet med arrayer Fordeler Man behøver ikke anslå noen størrelse når man oppretter strukturen. ArrayList-objektet vil utvide seg selv automatisk ArrayList har noen flere operatorer, for eksempel for søking Ulemper ArrayList er mer kronglete å bruke 07.03.2005 6

Problem Anta at vi ønsker å lage et program som leser inn linje for linje fra fil. Deretter skal programmet skrive ut linjene i motsatt rekkefølge. Vi lager først programmet ved bruk av vanlig array så ved bruk av ArrayList. 07.03.2005 7

import easyio.*; class Array1 { public static void main (String arg[]) { String line[] = new String[1000]; In file = new In(arg[0]); int nlines = 0; while (! file.endoffile()){ line[nlines++] = file.inline(); file.close(); Out skjerm = new Out(); while (nlines > 0){ skjerm.outln(line[--nlines]); 07.03.2005 8

import easyio.*; import java.util.arraylist; class Array2 { public static void main (String arg[]) { ArrayList a = new ArrayList(); In file = new In(arg[0]); while (! file.endoffile()){ a.add(file.inline()); file.close(); Out skjerm = new Out(); for (int i = a.size()-1; i >= 0; --i){ skjerm.outln((string) a.get(i)); 07.03.2005 9

Oppsummering ArrayList Listen lengde bestemmes ikke når den opprettes. Objekter blir satt inn i listen sekvensielt evt. andre objekter i listen blir overskrevet. For å hente ut objekter fra listen må klassen til objektet være kjent samt posisjonen til objektet i listen. Eksempel: (String) a.get(i); Listen kan bestå av forskjellige objekter. 07.03.2005 10

HashMap En HashMap er en form for tabell (i likhet med arrayer og ArrayLister). HashMap kan brukes til å holde orden på mange objekter. Den viktigste forskjellen mellom array/arraylist og HashMap er: I en array/arraylist legger vi inn objekter i en bestemt posisjon, og vi må gå tilbake til denne posisjonen/indeksen når vi senere skal se på objektet. Indeksen er et heltall mellom 0 og (length-1). I en HashMap oppgir vi en bestemt nøkkel (vanligvis en tekststreng) når vi legger inn et nytt objekt, og vi oppgir denne nøkkelen når vi senere skal se på objektet. Dvs. indeksen er en tekststreng. 07.03.2005 11

Med en HashMap kan man: legge inn nye objekter finne tilbake til et objekt som er lagt inn fjerne et objekt som er lagt inn løpe gjennom alle objektene i tabellen 07.03.2005 12

Å opprette en HashMap I starten av programmet: import java.util.*; Da importeres pakken java.util hvor bl.a. klassen HashMap ligger. I klassen eller metoden som skal bruke HashMap'en opprettes HashMap'en med: HashMap tabell = new HashMap(); Som for andre variable, hvis tabellen skal brukes av flere metoder i en klasse, deklareres variabelen ovenfor i starten av klassen (som en objektvariabel). Hvis tabellen kun skal brukes av en enkelt metode, er det naturlig å deklarere variabelen øverst (eller nesten øverst) inni denne metoden. 07.03.2005 13

Å legge inn et objekt i en HashMap Et hvilket som helst objekt i Java kan legges inn i en HashMap Når vi legger et objekt inn i HashMap'en, må vi samtidig oppgi en nøkkel (en tekststreng) som entydig identifiserer objektet. tabell.put(nøkkel, objekt); Vi trenger denne nøkkelen dersom vi senere skal finne (eller fjerne) objektet i HashMap'en. MyClass x = (MyClass) tabell.get(nøkkel); Det kan være fint å kunne bruke en tekst (en String) som nøkkel, f.eks. når: Finne data om en student ut fra hans eller hennes navn Finne data om en kommune ut fra kommunens navn. Finne en bil i et register ut fra bilnummeret Finne en CD i CD-arkivet ut fra tittelen på CD-en 07.03.2005 14

Konstruksjon av nøkkel Noen ganger konstrueres en nøkkel ut fra flere variable: String lengdegrad = "67.3"; String breddegrad = "53.3"; String posisjon = lengdegrad + ";" + breddegrad; tabell.put(posisjon, målestasjon); 07.03.2005 15

Å hente et objekt fra en HashMap For å hente et objekt med utgangspunkt i nøkkelen: Person p = (Person) tabell.get("jens"); Legg merke til at vi i starten må skrive i parentes navnet på klassen som objektet tilhører - i dette tilfellet klassen Person. Årsaken er at HashMap'en ikke holder rede på hvilken klasse objektene som legges inn har - bare at det er objekter. Når objektene hentes ut må vi derfor "minne Java på" hvilken klasse objektet var av (dette er egentlig et møte med en avansert og svært nyttig mekanisme i objektorienterte språk som kalles arv og som blir tatt opp i INF1010). Merk: å hente et objekt fra en HashMap slik som over medfører ikke at objektet fjernes fra HashMap'en. 07.03.2005 16

Overskriving av et objekt i en HashMap Dersom vi legger inn flere objekter med samme nøkkel, er det bare det sist innlagte objektet som blir liggende i tabellen (de andre overskrives): Person p1 = new Person(...); Person p2 = new Person(...); Person p3 = new Person(...); String navn = "Jens"; tabell.put(navn, p1); // p1 legges inn tabell.put(navn, p2); // p2 legges inn og p1 overskrives tabell.put(navn, p3); // p3 legges inn og p2 overskrives 07.03.2005 17

Å fjerne et objekt fra en HashMap For å fjerne et objekt med utgangspunkt i nøkkelen: tabell.remove("jens"); Dersom det ligger et objekt i HashMap'en med den gitte nøkkelen, blir objektet fjernet og setningen ovenfor returnerer med en peker til objektet som fjernes. Dersom det ikke ligger et objekt i HashMap'en med den gitte nøkkelen, returnerer setningen ovenfor med verdien null. 07.03.2005 18

Å få fatt i alle objektene i en HashMap For åfåfatt i alleobjektene i en HashMap på en gang, lager vi en egen oppramsing av alle objektene i HashMap'en: Iterator it = tabell.values().iterator(); Deretter kan vi se på hvert enkelt objekt i HashMap'en ved å gå i løkke: while (it.hasnext()) { Person p = (Person) it.next(); <gjør noe med Person-objektet> 07.03.2005 19

To måter å løpe gjennom en HashMap Løpe gjennom verdiene (som på forrige foil) Iterator it = tabell.values().iterator(); while (it.hasnext()) { Person p = (Person) it.next(); <gjør noe med objektet> Løpe gjennom nøklene Iterator it = tabell.keyset().iterator(); while (it.hasnext()) { String nøkkel = (String) it.next(); <gjør noe med nøkkelen> 07.03.2005 20

Metoder i HashMap Metode put get remove containskey values keyset Eksempel tabell.put(id, obj); (Person) tabell.get(id); tabell.remove(id); if (tabell.containskey(id)){ // gjør et eller annet Iterator it = tabell.values().iterator(); Iterator it = tabell.keyset().iterator(); Beskrivelse Legg inn objekt Finn objekt Fjern objekt Sjekk om nøkkel finnes i tabell Lag oppramsing av objektene Lag oppramsing av nøklene 07.03.2005 21

Skal vi bruke array, ArrayList eller HashMap? Array: kan lagre et på forhånd spesifisert antall verdier eller objekter hver tabell kan bare lagre verdier av én type ArrayList: kan lagre et uspesifisert antall objekter kan lagre objekter av ulik klasse kan sette inn og fjerne objekter i tabellen HashMap: kan lagre et uspesifisert antall objekter hver tabell kan lagre objekter av ulike klasser kan sette inn og fjerne objekter i tabellen 07.03.2005 22 kan gjøre oppslag ved hjelp av en nøkkel

Et fullstendig eksempel Vi lager et program som består av to klasser: class TestHashMap (inneholder bl.a. main-metoden) class Person (med objektvariablene navn og fnr) Programmet skal lage en HashMap og et objekt av klassen Person, og skal legge sistnevnte objekt inn i HashMap'en, med "Petter" som nøkkel. Deretter skal programmet - ut fra nøkkelverdien "Petter" - finne fram Person-objektet igjen i HashMap'en. 07.03.2005 23

import java.util.*; class TestHashMap { public static void main (String [] args) { TestHashMap test = new TestHashMap(); TestHashMap() { HashMap h = new HashMap(); Person p1 = new Person("Petter", "12128646733"); h.put("petter", p1); Person p2 = (Person) h.get("petter"); p2.skrivut(); class Person { String navn; String fnr; Person (String navn, String fnr) { this.navn = navn; this.fnr = fnr; void skrivut() { System.out.println("Navn: " + navn); System.out.println("Fnr: " + fnr); 07.03.2005 24

Eksempel: ELIZA - den elektroniske psykiater ELIZA: program skrevet av Joseph Weizenbaum i 1966 for studier av språklig kommunikasjon mellom mennesker og datamaskiner. Programmet imiterer en psykiater, slik som i dette eksemplet: Person : Men are all alike. ELIZA : In what way? Person : They're always bugging us about something or other. ELIZA : Can you think of a specific example? Person : Well, my boyfriend made me come here. ELIZA : Your boyfriend made you come here? Person : He says I'm depressed much of the time. ELIZA : I am sorry to hear that you are depressed. Person : It's true. I am unhappy. ELIZA : Do you think coming here will help you not to be unhappy? Person : I need some help, that much seems certain. ELIZA : What would it mean to you if you got some help? Person : Perhaps I could learn to get along with my mother. ELIZA : Tell me more about your family 07.03.2005 25

En samtalepartner Vi skal nå lage et programmer som basert på en eksisterende assosiasjonsliste gjør det mulig å "snakke med maskinen", slik at hver gang maskinen gjenkjenner et ord gir den et bestemt (og tilnærmet fornuftig) svar. Det første programmet gjør er å gå i løkke å leser inn assosiasjonslisten assosiasjoner.txt. Den blir lagt inn i en HashMap med assosiasjonsordet som nøkkel. Deretter skal programmet gå i løkke og be brukeren skrive noe, hvoretter programmer skriver ut tilhørende svar (hvis et av ordene brukeren skriver er registrert i assosiasjoner.txt). 07.03.2005 26

assosiasjoner.txt mat Liker du pizza? pizza Jeg liker ikke pizza. sulten Det er viktig å få i seg nok mat. hallo Heisan. hei Hei du. Fortell hvorfor du er kommet til meg. morn Morn du. Hva kan jeg hjelpe deg med. heisan God formiddag, og hva er ditt problem 07.03.2005 27

import easyio.* import java.util.* class Eliza1 { main() Program skisse class Psykiater { HashMap h = new HashMap(); In tast = new In(); Out skjerm = new Out(); void lesfrafil() { //her skal vi lese dataene fra filen assosiasjoner.txt og lagre dem i en HashMap void samtale() { //her skal vi lese inn tekst fra skjermen og lete gjennom HashMap-en etter respons 07.03.2005 28

Metoden lesfrafil() void lesfrafil() { In innfil = new In("assosiasjoner.txt"); //åpner filen for lesing while (!innfil.lastitem()) { //sjekker om det er mer igjen å lese på filen String s1 = innfil.inword(); //leser inn assosiasjonsordet (nøkkelen) String s2 = innfil.inline(); //leser inn responsen h.put(s1, s2); //lagrer responsen med assosiasjonsordet som nøkkel innfil.close(); //lukker assosiasjoner.txt 07.03.2005 29

Skisse til metoden samtale() void samtale() { //be om respons fra bruker og les inn fra skjerm while(!avslutt){//hvis ikke brukeren vil avslutte les inn setningen //for hver setning trenger vi å dele den opp i ord, teste om ordet er en nøkkel i h //vi lager en klasse Setning med metodene flereord() og nesteord(). //gå i løkke gjennom hvert ord i setningen, for første ord i setningen som er en //nøkkel i h les responsen og skriv den ut på skjermen //hvis ingen ord i setningen er nøkkel i h, be brukeren utdype svaret //les inn nytt svar 07.03.2005 30

Klassen Setning class Setning { String s; Setning(String t) { s = t + " "; //legger et ekstra mellomrom etter setningen boolean flereord() { while (s.length() > 0 && s.charat(0) == ' ') { s = s.substring(1); //leser over mellomrom return (s.length() > 0); //returnerer false når det ikke er flere ord i setningen String nesteord() { int k = s.indexof(' '); //leser lengden til neste mellomrom String t = s.substring(0, k); //leser neste ord s = s.substring(k); //tar vare på resten av setningen i s return t; 07.03.2005 31

Metoden samtale() void samtale() { skjerm.outln("hei, jeg er din psykiater. Jeg skal prøve å hjelpe deg."); skjerm.outln("for å avslutte, skriv 'avslutt'"); skjerm.out(">"); String svar = tast.inword("\n"); //leser inn fra skjerm til linjeskift while (!svar.equals("avslutt")) { Setning set = new Setning(svar); //lager objekt av klassen Setning boolean funnet = false; //initialiserer den boolske variabelen funnet while(set.flereord() &&!funnet) { String ord = set.nesteord(); //leser neste ord i setningen if (h.containskey(ord)) { //sjekker om ordet er en nøkkel i h String respons = (String) h.get(ord); //hvis nøkkel leser respons funnet = true; skjerm.outln(respons); if (!funnet) { skjerm.outln("fortell mer!"); skjerm.out(">"); svar = tast.inword("\n"); 07.03.2005 32

Klassen Eliza1 med main metoden. import easyio.*; import java.util.*; class Eliza1 { public static void main (String[] args) { Psykiater psy = new Psykiater(); psy.lesfrafil(); psy.samtale(); 07.03.2005 33

Programeksempler på nettsiden Du finner hele programmet vi nettopp gikk gjennom på kursets nettsider, under pekeren "Programmer fra forelesninger" og videre under "Java10". Der finner du også et enda større programeksempel som illustrerer bruk av HashMap, innlesning fra fil og skriving til fil. Dette eksemplet er laget av en av øvingslærerne (Nils Petter Wien). 07.03.2005 34