INF1000: Forelesning 10

Like dokumenter
INF1000: Forelesning 11

Uke 11 noen tips og råd + eksempel. Noen muligheter. Valg av datamodell: eksempel. Valg av datamodell: oblig 4

Oblig4 - forklaringer. Arne og Ole Christian

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

Inf1000 (Uke 10) HashMap og ArrayList

To måter å programmere på. Java 12. Objektvariable. Objektvariablenes levetid. Statisk programmering: Programmering med objekter: Dagens forelesning:

Oblig4 - forklaringer. Arne og Ole Christian

Oblig4: Komme igang. INF1000 Uke 11. Filer Vi skal lese data fra to filer og analysere dem (Stasjoner-1.txt, Vaerdata-1.txt) Noen generelle tips

To måter å programmere på. INF1000 : Forelesning 9. Programmering uten objekter. Programmering med objekter: Eksempel på programmering uten objekter

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.

Inf1000 (Uke 10) Oppgaveløsning. Hashmap

Uke 8 - Oppramstyper, HashMap og Innstikksortering, litt javadoc. 17. oktober 2013, Arne Maus Inst. for informatikk, UiO

Oppramstyper, HashMap og Innstikksortering, litt. 6. oktober 2009, Arne Maus Inst. for informatikk, UiO

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

Oversikt. En del repetisjon. Noen generelle råd INF1000 Uke 10 Gjennomgang av et eksempel. Kunstig intelligens? INF1000-seminar

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

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

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

1. Separatorer (skilletegn) i easyio

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

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

Kom forberedt til tirsdag. INF1000 Tips til obligatorisk oppgave 4. Noen generelle tips. Oblig4: Komme igang

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Gjennomgang av eksamen H99

UNIVERSITETET I OSLO

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

Forelesning inf Java 4

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

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

INF Uke 10. Ukesoppgaver oktober 2012

Råd 1: Programmer ovenfra ned. INF1000 Uke 10. Gruppering etter eier. Velg datastruktur etter hva som skal gjøres!

INF1000 Uke 10. Hvordan gripe an et stort problem? 5 råd Noen eksempler du kan overføre til Oblig 4 Oblig 4 kort oversikt Et større programeksempel

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

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

s 678 * Hvordan designe og programmere objektorientert * Støtte til oppstart på Oblig 4: Jobbe frem eget forslag til datastruktur

INF 1000 høsten 2011 Uke 10: 25. november

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

Hva er en metode? INF1000 Forelesning 8. Hva skjer når vi kaller en metode? Hvorfor bruke metoder?

INF1000 : Forelesning 4

UNIVERSITETET I OSLO

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

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

(MVC - Model, View, Control)

Ole Christian Lingjærde, 12. september 2013

Forelesning inf Java 4

INF1000 Forelesning 8. Litt repetisjon: Metoder og klasser Innkapsling av variable og metoder Hvordan gripe an et stort problem?

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

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

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

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

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

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

UNIVERSITETET I OSLO

Forelesning inf Java 5

Forelesning inf Java 5

INF Forelesning 10. Eksempler på Hashmap Oppramstyper Innstikksortering Javadoc

Oblig4 - forklaringer

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; }

INF 1000 Prøveeksamen. 23. november Ole Christian og Arne. Oppgave 1 (10 poeng) Er disse programsetningene lovlige i Java? Oppgave 2 (10 poeng)

Gjennomgang av en tenkt eksamensoppgave

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

Uke 9 INF okt 2012 Om separatorer I easyio, Eliza (bruk av HashMap), + mer om metoder og klasser. Arne Maus OMS, Ifi, UiO

INF1000 : Forelesning 5

Gjennomgang av en tenkt eksamensoppgave

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

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

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

To måter å programmere på. Java 12. Programmering med objekter. Statisk programmering

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

Endret litt som ukeoppgave i INF1010 våren 2004

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

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

for (int i=0; i<3; i++) { for (int j=0; j<5; j++) { System.out.print(i*j); System.out.println();

Oversikt (for deg som ikke er helt sikker på å få A) Inf1000 uke 12 4.nov Sjekkliste forts. variabler, typer og tilordning

Løsningsforslag, inf101, våren 2001

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

Java 4. Mer om easyio Mer om forgreninger Løkker. 7. september 2004

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Løsningsforslag til eksamen i INF1000 våren 2006

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Eksempel: Body Mass Index (BMI) Forelesning inf Java 3. Ferdig program (første del) Ferdig program (siste del)

INF1000 : Forelesning 3

Blokker og metoder INF1000 (Uke 6) Metoder

UNIVERSITETET I OSLO

Body Mass Index (BMI) INF1000 : Forelesning 3. Ferdig program (forts.) Ferdig program

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

Forelesning inf Java 5

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

b) 10 2 = 20 c) 5 1 = 5.

Transkript:

HashMap Mer om HashMap Noen råd i forbindelse med oblig 4 31. oktober 2006 Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo INF1000: Forelesning 10 Brukes til å holde orden på en samling objekter Alternativ til arrayer Akkurat som for arrayer 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 Viktig forskjell mellom arrayer og HashMap: I en array 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 vi inn et nytt objekt, og vi oppgir denne nøkkelen når vi senere skal se på objektet. Dvs. indeksen er en tekststreng. 1 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 2 Eksempel på bruk av HashMap Importer pakken java.util import java.util.*; class BrukAvHashMap { public static void main (String[] args) { HashMap h = new HashMap(); Opprett en HashMap String fnr1 = 30128812344"; Person per1 = new Person(fnr1, "Harald Olsen"); h.put(fnr1, per1); Legg inn Person-objekt i HashMap en String fnr2 = 14109512547"; Person per2 = new Person(fnr2, Lena Torsen"); h.put(fnr2, per2); Legg inn Person-objekt i HashMap en Person p = (Person) h.get( 30128812344 ); Hent Person-objekt fra HashMap en class Person { String navn; String adresse; Person(String navn, String adresse) { this.navn = navn; this.adresse = adresse; Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 3 I starten av programmet: import java.util.*; Opprette en HashMap Dette importerer pakken java.util hvor bl.a. klassen HashMap ligger. I klassen eller metoden som skal bruke HashMap'en: HashMap h = new HashMap(); NB: 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 ovenfor inni den aktuelle metoden. Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 4

Legge inn objekt i 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, dvs en tekststreng som entydig identifiserer objektet. Vi trenger denne nøkkelen dersom vi senere skal finne eller fjerne objektet i HashMap'en. Eksempel: String fnr = 30126512345 ; Person p = new Person(fnr, Kari Olsen ); h.put(fnr, p); Her lager vi først et Person-objekt (med passende argumenter) og legger det deretter inn i tabellen med fødselsnummeret som nøkkel. 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"; h.put(navn, p1); // p1 legges inn h.put(navn, p2); // p2 legges inn og p1 overskrives h.put(navn, p3); // p3 legges inn og p2 overskrives Noen ganger må vi konstruere en nøkkel ut fra flere variable for å få entydighet: String lengdegrad = "67.3"; String breddegrad = "53.3"; String posisjon = lengdegrad + ";" + breddegrad; Fjelltopp fjell = new Fjelltopp(posisjon, Bjørnefjell ); h.put(posisjon, fjell); Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 5 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 6 Hente objekt fra HashMap Fjerne objekt fra HashMap For å hente et objekt med utgangspunkt i nøkkelen: // Vi vil finne en person ut fra fødselsnummeret: Person p = (Person) h.get(fnr); 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 vårens INF1010). For å fjerne et objekt med gitt fødselsnummer som nøkkel: h.remove(fnr); 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 verdien null. Merk: å hente et objekt fra en HashMap slik som over medfører ikke at objektet fjernes fra HashMap'en. Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 7 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 8

Løp gjennom alle objekter i HashMap To måter å løpe gjennom en HashMap For å løpe gjennom alle objektene i en HashMap, lager vi en oppramsing: Iterator it = h.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(); System.out.println( Navn: + p.fånavn()); Løpe gjennom objektene (som på forrige foil): Iterator it = h.values().iterator(); while (it.hasnext()) { Person p = (Person) it.next(); <gjør noe med objektet> Løpe gjennom nøklene: Iterator it = h.keyset().iterator(); while (it.hasnext()) { String nøkkel = (String) it.next(); <gjør noe med nøkkelen> Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 9 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 10 Metoder i HashMap Råd 1: Skriv programmer "ovenfra og ned" Metode put get remove containskey values keyset Eksempel h.put(nøkkel, objekt); Person p = (Person) h.get(nøkkel); h.remove(nøkkel); if (h.containskey(nøkkel)) { // gjør et eller annet Iterator it = h.values().iterator(); Iterator it = h.keyset().iterator(); Beskrivelse Legg inn objekt med gitt nøkkel Finn objekt Fjern objekt Sjekk om nøkkel finnes i tabell Lag oppramsing av objektene Lag oppramsing av nøklene Bestem først hvilke klasser som skal være med (og deres rolle) Fyll inn de mest sentrale variablene (de som utgjør datastrukturen), og skriv eventuelle nye klasser som trengs i datastrukturen Skriv metodene på toppnivå (dvs de som styrer den overordnede programflyten, f.eks. en kommandoløkke). Kall på metoder ved behov, selv om disse ennå ikke er skrevet. Skriv metodene du kaller på ovenfor, og fortsett til programmet er ferdig. Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 11 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 12

Råd 2: skriv metoder "utenfra og inn" Råd 3: Deleger oppgaver Når du skal skrive en metode, bestem først av alt hva som er input og output til metoden: Input: Eventuelle parametre til metoden Kan også være klassevariable/objektvariable (eksempel: de to HashMap ene skal brukes i mange av metodene i klassen VaerAnalyse, selv om de ikke er parametre til metodene). Output: Eventuell returverdi fra metoden Kan også være modifikasjoner av klassevariable/objektvariable (f.eks. endring av innholdet i de to HashMap ene). Et viktig kjennetegn ved god programmering er at man delegerer oppgaver når det er naturlig - dvs kaller på metoder for å utføre deloppgaver. Dermed blir hver enkelt del av programmet oversiktlig, og faren for feil minimeres. Det blir også lettere å finne feil senere. Eksempel: Hvert case i en kommandoløkke kaller på en metode som utfører den ønskede kommandoen, i stedet for at alt gjøres inni selve kommandoløkken. NB: ikke overdriv delegering. Det er f.eks. ofte ikke naturlig at hvert eneste objekt har metoder for å lese fra terminal - det kan i mange tilfeller være bedre å gjøre slike ting sentralt (og heller kalle på metoder i objektene for å oppdatere deres variable). Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 13 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 14 Dårlig: Bra: Råd 4: formater alltid koden underveis class Eksempel { public static void main (String [] args) { int x = 0; for (int i=0; i<10; i++) { x = x + 1; if (x < 0) { System.out.println("Det var rart"); class Eksempel { public static void main (String [] args) { int x = 0; Råd 5: ikke endre på forutsetningene Selv om mange oppgaver tar utgangspunkt i problemer fra virkeligheten, er de ikke nødvendigvis laget for å være særlig realistiske. Ikke endre på forutsetningene i slike tilfeller - uansett hvor fristende det måtte være. Løs oppgaven slik den er formulert. Hvis du mener oppgaven gir rom for flere tolkninger på et punkt: gjør dine egne (rimelige) forutsetninger - og skriv i oppgaven hva disse er. for (int i=0; i<10; i++) { x = x + 1; if (x < 0) { System.out.println("Det var rart"); Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 16 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 15

Eksempel: oblig 4 Oblig 4: trinn 1 class Oblig4 Inneholder kun main-metoden. Lager objekt av klassen under og kaller på ordreløkke-metode. class Analyse Inneholder ordreløkke og andre metoder + HashMap-tabeller for å holde orden på værstasjonene. class Stasjon Hvert objekt inneholder info om en værstasjon + alle data fra stasjonen class Maaned Hvert objekt inneholder info om en måned med værdata fra en stasjon import easyio.*; import java.util.*; class Oblig4 { public static void main (String[] args) { String s1 = "Stasjonsdata-1.txt"; String s2 = "Meteorologidata-1.txt"; Analyse a = new Analyse(s1, s2); a.ordreløkke(); class Dag Hvert objekt inneholder info om dagsmålinger foretatt ved en stasjon Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 17 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 18 Oblig 4: trinn 2 De to HashMap ene class Analyse { HashMap hashnavnstasjon = new HashMap(); HashMap hashnummstasjon = new HashMap(); Analyse(String s1, String s2) { lesstasjonsdata(s1); lesmeteorologidata(s2); void lesstasjonsdata(string fnavn) { void lesmeteorologidata(string fnavn) { void ordreløkke() { Datastruktur Konstruktør som gjør initialisering (her: lese data fra fil) Metoder for å lese fra fil og for å lese inn kommando fra bruker Her kommer det metoder som skal kalles fra ordreløkken HashMap hashnavnstasjon = new HashMap(); Brukes for å holde orden på værstasjoner, med stasjonsnavn som nøkkel. HashMap hashnummstasjon = new HashMap(); Brukes for å holde orden på værstasjoner, med stasjonsnummer som nøkkel. Eksempel på å sette inn i de to HashMap ene: // Anta at opplysninger om en stasjon er lest fra fil Stasjon st = new Stasjon(stNr, stnavn, sthøyde, stkommune, stfylke); hashnummstasjon.put(stnr, st); hashnavnstasjon.put(stnavn, st); Viktig: det er samme stasjonsobjekt som skal settes inn i begge HashMap er! Eksempel på å hente ut fra de to HashMap ene: Stasjon st = (Stasjon) hashnummstasjon.get(stasjonsnummer); Stasjon st = (Stasjon) hashnavnstasjon.get(stasjonsnavn); Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 19 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 20

Oblig 4: trinn 3 Oblig 4: trinn 4 void lesstasjonsdata(string filnavn) Skal lese fil med data om værstasjoner. Gå i løkke, hvor hvert gjennomløp leser en linje fra fila, lager et objekt av klassen Stasjon og fyller med innleste verdier, og legger objektet inn i de to HashMap ene. void lesmeteorologidata(string filnavn) Skal lese fil med værdata. Mulig løsning 1: gå i løkke, hvor hvert gjennomløp leser en linje fra fila, får tak i riktig Stasjons-objekt (ikke lag nytt Stasjons-objekt, bruk HashMap ene) og oppdaterer dette objektet med de nye værdataene ved å kalle på en passende metode i Stasjonsobjektet (f.eks. registrermåling(.)). Stasjonsobjektet må så finne ut hvilket Maaned-objekt som skal oppdateres, og delegerer oppdraget videre til dette objektet ved å kalle på en passende metode i dette Maaned-objektet (f.eks. nymåling()). Mulig løsning 2: i stedet for at fila leses sentralt (i Analyse-objektet) kan selve jobben med å lese data om en gitt stasjon delegeres til Stasjons-objektet. Verken mer eller mindre objektorientert, men noen liker dette bedre. Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 21 Programmer ordreløkken For hver kommando som skal utføres, skal ordreløkken kalle på en passende metode i klassen VaerAnalyse. Du skal altså ikke legge programkode for å utføre kommandoer i løkka, bare delegere oppdraget videre. For at programmet skal kompilere, sørg for å deklarere alle de metodene som du kaller på fra ordreløkke-metoden. Du kan vente med å fylle inn innholdet i disse metodene, dvs bare fyll inn en utskriftssetning i hver av metodene. Eksempel: hvis ordreløkken kaller på metoden lagstasjonsliste(), så deklarerer du samtidig denne dummy-metoden i klassen VaerAnalyse: void lagstasjonsliste() { System.out.println( Metoden lagstasjonsliste utført ); Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 22 Oblig 4: trinn 5 Oblig 4: trinn 6 Programmer metodene som kalles fra ordreløkken Eksempel (i klassen Analyse): void finnantalluværsdager() { <Løp gjennom en av HashMap ene og skriv ut liste over alle stasjoner, med stasjonsnr og stasjonsnavn for hver av dem> System.out.println( Stasjonsnummer: ); String stasjonsnr = tast.inline(); System.out.println( Måned (1-6): ); int mnd = tast.inint(); Skriv de metodene som kalles fra metodene i trinn 5. Eksempel (i klassen Stasjon): int finnantuværsdager(int mnd) { Maaned md = mdata[mnd-1]; int antdager = md.finnantuværsdager(); return antdager; Oppdraget delegeres videre til en metode i Maaned-objektet som er berørt. Stasjon st = <finn stasjonen ved oppslag i hashnummstasjon>; int antdager = st.finnantuværsdager(mnd); <Skriv ut resultatet> Oppdraget delegeres videre til en metode i Stasjons-objektet som er berørt. Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 23 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 24

Skriv de metodene som kalles fra metodene i trinn 6. Eksempel (i klassen Maaned): Oblig 4: trinn 7 int finnantuværsdager() { <gå gjennom data for alle dager i måneden og tell opp hvor mange som oppfyller kravet til uværsdag> <returner med antallet uværsdager> 1 class Analyse { void ordreløkke() { finnantalluværsdager(); void finnantalluværsdager() { int antdager = st.finnantuværsdager(mnd); 2 class Stasjon { int finnantuværsdager(int mnd) { Maaned md = mdata[mnd-1]; int antdager = md.finnantuværsdager(); return antdager; 3 class Maaned { int finnantuværsdager() { Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 25 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: ALICE: En kunstig intelligens-basert prate-robot ALICE = Artificial Linguistic Internet Computer Entity http://alice.pandorabots.com 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 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 27 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 28

Human: Hi Alice ALICE: Hello there. Human: How are you doing today? ALICE: Ah. I'm doing great, how about you? Human: I'm ok, listen can I ask you something? ALICE: I am listening to you. Go ahead. Ask me anything. Human: How many are you talking to at this moment? ALICE: Right now there are 100 clients on line. Human: You must be very busy ALICE: Thanks for telling me that I am busy. Human: Do you ever go on vacation? ALICE: Robots never take vacations. Human: Do you ever feel tired? ALICE: As a robot I lack any human emotions. Human: I sometimes feel tired ALICE: What is that feeling like? Better get some rest. Human: What is 2 + 2? ALICE: Four. Human: What is the square root of 5? ALICE: Do you have a life? I think you already know the answer anyways. Human: That was very rude ALICE: I thought it was too. Human: What is Java? ALICE: Java is the latest in the C family of languages. Proponents of Java cite its universal "write once, run anywhere" promise. Actually Java borrow a lot of features from AI languages like Lisp. Human: Do you like Java? ALICE: Yes Java is a pretty cool language for AI. En samtalepartner Filen ord.txt Vi skal nå lage et program som gjør det mulig å "snakke med maskinen". Hver gang maskinen gjenkjenner et ord i det vi skriver så gir den et bestemt (og tilnærmet fornuftig) svar. Mer konkret: Programmet skal først lese filen "ord.txt" som inneholder en del søkeord med tilhørende svar og legge disse inn i en HashMap. Programmet skal deretter gå i løkke, og i hvert gjennomløp av løkken skal programmet: vente på og lese inn en linje fra terminal (bruker-input) søke etter matchende ord i input og søkeord i HashMap'en skrive ut tilhørende svar (evt et standard-svar hvis ingen match) Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 31 hei Hei du. Fortell hvorfor du er kommet til meg! morn Morn du. Hva kan jeg hjelpe med? heisan God formiddag, og hva er ditt problem? dager Det var ikke saa lenge. uker Det var lenge. maaneder Det var veldig lenge. vondt Hvor lenge har du vaert slik? hodet Hvilke symptomer har du kjent? trist Foeler du deg deprimert? jobber Jobber du veldig mye? jobbe Jobber du veldig mye? syk Hva med aa kontakte en lege? frisk Det er viktig aa holde seg frisk.. Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 32

Programskisse import easyio.*; import java.util.*; class Eliza { public static void main (String [] args) { class Samtale { HashMap hash = new HashMap(); In tast = new In(); void lesfrafil() { class Eliza { public static void main (String [] args) { Samtale sam = new Samtale(); sam.lesfrafil(); sam.snakk(); void snakk() { Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 33 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 34 void lesfrafil() { In fil = new In("ord.txt"); while (!fil.lastitem()) { String søkeord = fil.inword(); String svar = fil.inline(); hash.put(søkeord, svar); fil.close(); System.out.println("Antall ord lest: " + hash.size()); Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 35 void snakk() { while (true) { System.out.print("> "); boolean funnetmatch = false; do { String ord = tast.inword().tolowercase(); if (hash.containskey(ord)) { String svar = (String) hash.get(ord); System.out.println(svar); funnetmatch = true; while (tast.hasnext() &&!funnetmatch); if (!funnetmatch) { System.out.println("Interessant. Fortell mer."); if (tast.hasnext()) { tast.readline(); // Tømmer inputbufferet Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 36

Du finner hele programmet Eliza.java på nettsidene til kurset (se detaljert undervisningsplan), sammen med fila ord.txt. Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 37