INF1000: Forelesning 11

Like dokumenter
INF1000: Forelesning 10

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

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 (Uke 10) HashMap og ArrayList

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

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

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

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

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

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

Inf1000 (Uke 10) Oppgaveløsning. Hashmap

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

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

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

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

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

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

1. Separatorer (skilletegn) i easyio

UNIVERSITETET I OSLO

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

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

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

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

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

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

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

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

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

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

Ole Christian Lingjærde, 12. september 2013

Forelesning inf Java 4

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

UNIVERSITETET I OSLO

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

INF Uke 10. Ukesoppgaver oktober 2012

INF1000 : Forelesning 4

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

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

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

Gjennomgang av eksamen H99

Forelesning inf Java 5

Forelesning inf Java 5

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

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

(MVC - Model, View, Control)

UNIVERSITETET I OSLO

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

INF1000 : Forelesning 3

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

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

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

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

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

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

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

UNIVERSITETET I OSLO

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

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

Eksempel: Body Mass Index (BMI)

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

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

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

UNIVERSITETET I OSLO

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

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

INF1000 : Forelesning 5

Løsningsforslag til eksamen i INF1000 våren 2006

Gjennomgang av en tenkt eksamensoppgave

Løsningsforslag, inf101, våren 2001

Endret litt som ukeoppgave i INF1010 våren 2004

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

Blokker og metoder INF1000 (Uke 6) Metoder

Oblig4 - forklaringer

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

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

INF Forelesning 10. Eksempler på Hashmap Oppramstyper Innstikksortering Javadoc

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

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

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

Gjennomgang av en tenkt eksamensoppgave

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000 HashMap. Marit Nybakken 2. november 2003

1. Krav til klasseparametre 2. Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF1000: Forelesning 4. Mer om arrayer Metoder

Forelesning inf Java 3

Repetisjon: operatorene ++ og -- Java 5. Nøtt. Oppgave 1 (fra forrige gang) 0 udefinert udefinert. Alternativ 1 Prefiks-operator

INF1000: noen avsluttende ord

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.

Transkript:

HashMap Mer om HashMap Noen råd i forbindelse med oblig 4 16. april 2007 INF1000: Forelesning 11 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 Ulike versjoner i Java 1.4 (gammel) og Java 1.5 Vi gjennomgår begge måtene, men anbefaler klart at 1.5-måten nyttes, da den hjelper deg mot visse feil (som ellers er lett å gjøre). 1.4 måten er viktig fordi mange gamle programmer inneholder slik kode. Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 3 import java.util.*; class BrukAvHashMap { public static void main (String[] args) { HashMap<String,Person> h = new HashMap <String,Person>(); String fnr1 = 30128812344"; Person per1 = new Person(fnr1, "Harald Olsen"); h.put(fnr1, per1); Legg inn Person-objekt i HashMap en String fnr2 = 14109522547"; Person per2 = new Person(fnr2, Lena Torsen"); h.put(fnr2, per2); Legg inn Person-objekt i HashMap en Person p = h.get( 30128812344 ); class Person { String fnr; String navn; Person(String fnr, String navn) { this.fnr = fnr; Eksempel på bruk av HashMap (1.5) Importer pakken java.util Opprett en HashMap og forteller this.navn = navn; hvilke klasser nøkkelen og verdier har. Hent Person-objekt fra HashMap en Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 4

Opprette en HashMap, Java1.4 (gammel) og Java 1.5 Legge inn objekt i HashMap (samme i 1.4 og 1.5) I starten av programmet: import java.util.*; Dette importerer pakken java.util hvor bl.a. klassen HashMap ligger. I klassen eller metoden som skal bruke HashMap'en Java 1.4: HashMap h = new HashMap(); I klassen eller metoden som skal bruke HashMap'en Java 1.5 (best): HashMap <String,Person> h = new HashMap <String,Person>(); I Java 1.5 forteller vi hvilke klasser nøkkel- og verdi-objektene kommer fra. Vi sier at vi da låser objektene til både nøkkelen og verdi-objektene til å være av disse typene. 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 5 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. Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 6 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 7 Hente objekt fra HashMap Java 1.4 og 1.5 Java 1.4: For å hente et objekt med utgangspunkt i nøkkelen: // 1.4: Vi vil finne en person ut fra fødselsnummeret: Person p = (Person) h.get(fnr); Legg merke til at vi i 1.4 i starten må skrive i parentes navnet på klassen som objektet tilhører - i dette tilfellet klassen Person. Årsaken er at i 1.4 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). Java 1.5: For å hente et objekt med utgangspunkt i nøkkelen, nå trenger vi ikke si hvilken klasse objektet har (det har vi jo sagt i deklarasjonen av HashMapen h): // 1.5: Vi vil finne en person ut fra fødselsnummeret: Person p = h.get(fnr) Merk: å hente et objekt fra en HashMap slik som over medfører ikke at objektet fjernes fra HashMap'en (vi får bare en kopi av peker til objektet). Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 8

Fjerne objekt fra HashMap Løp gjennom alle objekter i HashMap Java 1.4 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. 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()); Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 9 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 10 Løp gjennom alle objekter i HashMap Java 1.5 To måter å løpe gjennom en HashMap 1.5 For å løpe gjennom alle objektene i en HashMap, lager vi en oppramsing og låser samtidig det vi skal hente til en bestemt klasse: Iterator <Person> 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 = it.next(); System.out.println( Navn: + p.fånavn()); Vi kan også i 1.5 nytte den nye for-løkka som automatisk lager en iterator for (Person p: h.values()) { System.out.println( Navn: + p.fånavn()); Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 11 Løpe gjennom objektene (som på forrige foil): Iterator <Person>it = h.values().iterator(); while (it.hasnext()) { Person p = it.next(); <gjør noe med objektet> Løpe gjennom nøklene: Iterator <String> it = h.keyset().iterator(); while (it.hasnext()) { String nøkkel = it.next(); <gjør noe med nøkkelen> Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 12

Metoder i HashMap Metoder i Iterator (oppramsing) Metode Eksempel Beskrivelse Metode put Eksempel h.put(nøkkel, objekt); Beskrivelse Legg inn objekt med gitt nøkkel hasnext() while (it.hasnext()) { < les neste og gjør noe>; returnerer true hvis flere objekter i oppramsingen get -1.4 get -1.5 remove Person p = (Person) h.get(nøkkel); Person p = h.get(nøkkel); h.remove(nøkkel); Finn objekt Fjern objekt next() 1.5 next() 1.4 Person p = it.next(); Person p = (Person) it.next(); Finn neste objekt containskey if (h.containskey(nøkkel)) { // gjør et eller annet Sjekk om nøkkel finnes i tabell values keyset Iterator it = h.values().iterator(); Iterator it = h.keyset().iterator(); Lag oppramsing av objektene Lag oppramsing av nøklene remove() Person p = it.next(); if (p.navn.equals( Arne )) it.remove(); Fjern siste objekt som ble returnet med next() Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 13 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 14 import java.util.*; import easyio.*; class Hasheksempel { public static void main(string[] argv) { In tastatur = new In(); HashMap <String,Person> personregister = new HashMap <String,Person>(); System.out.print("Antall personer som registreres : "); int ant = tastatur.inint(); for (int i = 0; i < ant; i++) { System.out.println("Antall gjenværende personer " +(ant - i)); Person p = new Person(tastatur); personregister.put(p.telefonnr, p); // Skriv ut alle personobjektene System.out.println("Viser alle personer" + "(ukjent rekkefølge):"); class Person { String navn, adresse, telefonnr; Råd 1: Skriv programmer "ovenfra og ned" 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. Person (In tastatur) { System.out.print("Oppgi navn : "); navn = tastatur.inline(); System.out.print("Oppgi adresse : "); Skriv metodene du kaller på ovenfor, og fortsett til programmet er for (Person p: personregister.values()){ adresse = tastatur.inline(); p.skrivdata(); System.out.print("Oppgi telefonnummer : "); ferdig. telefonnr = tastatur.inline(); void skrivdata() { System.out.println("Navn : " + navn); Eksempel fra boka System.out.println("Adresse : " + adresse); System.out.println("Telefonnummer : " + telefonnr); Ole Chr. Lingjærde Institutt s.186 for informatikk 31. oktober 2006 15 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 16

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 17 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 18 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 20 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 19

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 21 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 22 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 23 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 24

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 25 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 26 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 27 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 28

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 29 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 31 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 32

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 35 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 36

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 37 Ole Chr. Lingjærde Institutt for informatikk 31. oktober 2006 38 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 39 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 40

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