INF1000 Forelesning 9. Hashmap Eksempel: Flyreservasjon

Like dokumenter
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 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

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

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

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: Forelesning 11

Inf1000 (Uke 10) Oppgaveløsning. Hashmap

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

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

INF1000: Forelesning 10

Inf1000 (Uke 10) HashMap og ArrayList

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

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

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

UNIVERSITETET I OSLO

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

INF Uke 10. Ukesoppgaver oktober 2012

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

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

Løsningsforslag til eksamen i INF1000 våren 2006

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

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

INF1000 HashMap. Marit Nybakken 2. november 2003

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

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

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

Løsningsforslag, inf101, våren 2001

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

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

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

1. Krav til klasseparametre 2. Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk 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; }

UNIVERSITETET I OSLO

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

Løsningsforslag eksamen in105, høsten 2000

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

Oblig4 - forklaringer. Arne og Ole Christian

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

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

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

INF1000: noen avsluttende ord

"Nelsons kaffebutikk"

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

INF Løsning på seminaropppgaver til uke 8

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

Oppgave 1 - Kortsvarsoppgave. INF1000 eksamen V05. Oppgave 1 (c) Oppgave 1 (b) Svar: a = 9, b=10

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

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

INF1000 Uke 10. Klassevariablenes levetid Ikke alt i et objekt bør være synlig fra resten av programsystemet - innkapsling

INF1000 : Forelesning 4

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

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Tuva Kristine Thoresen

UNIVERSITETET I OSLO

IN1010 våren januar. Objektorientering i Java

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

Gjennomgang av eksamen H99

UNIVERSITETET I OSLO

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

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

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

INF1000: Forelesning 6. Klasser og objekter del 1

UNIVERSITETET I OSLO

Oblig4 - forklaringer. Arne og Ole Christian

UNIVERSITETET I OSLO

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

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

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

INF1000 (Uke 12) Sortering

INF april Oblig 4: Filmregister. Filformat filmdata.txt OBLIG Tips til oblig 4 + repetisjon. Christian MaheshHansen

INF1000: Forelesning 4. Mer om arrayer Metoder

TOD063 Datastrukturer og algoritmer

Eksamen IN1010/INF1010 våren 2018

Forelesning inf Java 5

Forelesning inf Java 5

Gjennomgang av en tenkt eksamensoppgave

UNIVERSITETET I OSLO

Repetisjon. INF gruppe 13

UNIVERSITETET I OSLO

En klasse er noe - en metode gjør noe (! / # <= (! * +!! ",-' %. "- -/ %.!#) )! " 0'%! * *$! "1-)) '' % '. 22!'( 7/ /! * 2 2! "*"% 8"%% 9 - -!

UNIVERSITETET I OSLO

Blokker og metoder INF1000 (Uke 6) Metoder

UNIVERSITETET I OSLO

Dagens forelesning. Husk prøveeksamen Fredag 15/3-13 kl 12 i R1. Iterator-teknikken. Eksempel med bruk av Iterator og Iterable-grensesnittene

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

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

UNIVERSITETET I OSLO

Ole Christian Lingjærde, 12. september 2013

Forelesning inf Java 4

UNIVERSITETET I OSLO

Løsningsforslag INF desember 2007

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Transkript:

INF1000 Forelesning 9 Hashmap Eksempel: Flyreservasjon

HashMap Ofte har vi flere, mange objekter av en bestemt klasse - eks. : elever på en skole biler som har passert bomringen i Oslo telefonsamtaler fra en bestemt person,. HashMap er en måte å lagre objekter der det er å raskt og enkelt finne igjen ett av objektene ut fra et kjennetegn navnet til eleven, registreringsnummeret til en bil,... Et slikt kjennetegn som skiller ett objekt fra alle andre objekter, kaller vi en nøkkel (key)

Ulike versjoner i Java 1.4 (gammel) og Java 1.5/1.6 av HashMap Vi gjennomgår begge måtene, men anbefaler 1.5- måten den hjelper deg mot visse feil (som ellers er lett å gjøre) 1.4 måten gjennomgås fordi mange gamle programmer inneholder slik kode 3

Objekter lagres med en søkenøkkel I en array legger vi inn objekter i en bestemt posisjon Vi må vite om denne posisjonen når vi senere skal se på objektet Posisjonen er en indeks mellom 0 og length-1 I en HashMap oppgir vi en bestemt nøkkel når vi legger vi inn et nytt objekt (kalt verdien) Vi oppgir denne nøkkelen når vi senere skal se på objektet En HashMap vokser når legger inn nye elementer Hashmap er mer fleksibel enn array!

Bilde av HashMap HashMap<String,Person> h = new HashMap <String,Person>(); h fnr1 fnrn per1 pern fnr2 per2 nøkler verdier (keys) (values) 5

import java.util.*; class BrukAvHashMap { public static void main (String[] args){ Importer pakken java.util HashMap<String,Person> h = new HashMap <String,Person>(); String fnr1 = 30128812344"; Person per1 = new Person(fnr1, "Harald Olsen"); h.put(fnr1, per1); String fnr2 = 14109522547"; Person per2 = new Person(fnr2, Lena Torsen"); h.put(fnr2, per2); Person p = h.get( 30128812344 ); Oppretter en HashMap og forteller hvilke klasser nøkkelen og verdier har. Legg inn Person-objekt i HashMap en Legg inn Person-objekt i HashMap en Hent Person-objekt fra HashMap en class Person { String fnr; String navn; Person(String fnr, String navn) { this.fnr = fnr; this.navn = navn; String fånavn() { return navn; 6

Opprette en HashMap Java1.4 (gammel) og Java 1.5-1.6 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 og nyere: HashMap <String,Person> h = new HashMap <String,Person>(); Vi 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 HashMap variabelen ovenfor inni den aktuelle metoden. 7

Legge inn verdi-objekt i HashMap (samme i 1.4 og 1.5) Et hvilket som helst objekt kan legges inn som verdi i en HashMap I Java 1.5 må det være av den klassen vi har lovet systemet. Når vi legger et verdi-objekt inn i HashMap'en, må vi samtidig oppgi et nøkkel-objekt av riktig type. Vi trenger denne nøkkelen når vi senere skal finne eller fjerne verdi-objektet i HashMap'en. String fnr = 30126512345 ; Person p = new Person(fnr, Kari Olsen ); h.put(fnr, p); Her lager vi et Person-objekt og legger det deretter inn i tabellen med fødselsnummeret som nøkkel. 8

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

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 fnr: Person p = (Person) h.get(fnr); Vi må i starten skrive navnet på klassen som objektet tilhører i parentes - i dette tilfellet klassen Person. Java 1.5: For å hente et objekt med utgangspunkt i nøkkelen, trenger vi ikke si hvilken klasse objektet har (det har vi jo sagt i deklarasjonen av HashMapen): // 1.5: Vi vil finne en person ut fra fnr: 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). 10

Fjerne objekt fra HashMap 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. 11

Løp gjennom alle objekter i HashMap Java 1.4 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.ginavn()); 12

Løp gjennom alle objekter i HashMap Java 1.5 Vi 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.ginavn()); Vi kan også i 1.5 benytte en for-løkke som automatisk lager en iterator: for (Person p: h.values()) { System.out.println( Navn: + p.ginavn()); 13

To måter å løpe gjennom en HashMap 1.5 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 p> 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> 14

Metoder i HashMap Metode Eksempel Beskrivelse put h.put(nøkkel, objekt); Legg inn objekt med gitt nøkkel get -1.4 get -1.5 Person p = (Person) h.get(nøkkel); Person p = h.get(nøkkel); Finn objekt remove h.remove(nøkkel); Fjern objekt containskey if (h.containskey(nøkkel)) { // gjør et eller annet Sjekk om nøkkel finnes i tabell values Iterator it = h.values().iterator(); Lag oppramsing av objektene keyset Iterator it = h.keyset().iterator(); Lag oppramsing av nøklene 15

Iterator (oppramsing) Eksempel Iterator it1 = h.values().iterator(); Iterator it2 = h.keyset().iterator(); hasnext() while (it.hasnext()) { < les neste og gjør noe>; Beskrivelse deklararasjon returnerer true hvis flere objekter igjen i oppramsingen next() 1.5 next() 1.4 Person p = it.next(); Person p = (Person) it.next(); Finn neste objekt remove() Person p = it.next(); if (p.navn.equals( Arne )) it.remove(); Fjern siste objekt som ble returnert med next() while (it1.hasnext()) { Person p1 = it1.next(); for (Person p2 : h.values()){... To måter å gå gjennom alle verdiene (objektene) i h 16

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( Gi neste person ); Person p = new Person(tastatur); personregister.put(p.telefonnr, p); // Skriv ut alle personobjektene System.out.println("Viser alle personer" + "(ukjent rekkefølge):"); for (Person p: personregister.values()){ p.skrivdata(); Eksempel fra boka s.186 class Person { String navn, adresse, telefonnr; Person (In tastatur) { System.out.print("Oppgi navn : "); navn = tastatur.inline(); System.out.print("Oppgi adresse : "); adresse = tastatur.inline(); System.out.print("Oppgi telefonnummer : "); telefonnr = tastatur.inline(); void skrivdata() { System.out.println("Navn : " + navn); System.out.println("Adresse : " + adresse); System.out.println("Telefonnummer : +telefonnr);

Klasser Flyreservasjon Egenskaper Prosedyerer Systemet skal holde orden på alle selskapets flyvninger og reserverte seter på flyene En flyvning har en kode, et avreisested og en destinasjon, i tillegg til et fly, som har et identifikasjonsnummer Et fly består av seterader, med seter Systemet skal lese inn beskrivelse av flyene, med antall seter, klasser på de forskjellig seteradene, osv Det skal kunne reservere seter, avbestille og skrive ut en oversikt over flyets seter, med klasse og om det er ledig eller ikke

Klasseinndeling class Systemet Inneholder kun main-metoden Lager objekt av klassen under og kaller på brukerdialog-metode. class Flyreservasjon Inneholder brukerdialogen og andre metoder + HashMap-tabeller for å holde orden på flyvningene. class Fly Hvert objekt inneholder info om en flyet + alle seteradene og setene class Seterad Setene i raden class Sete Klasse og om det er opptatt eller ikke

class Systemet import easyio.*; import java.util.*; class Systemet { public static void main (String[] args) { String s1 = Fly.txt"; String s2 = Bestillinger.txt"; Flyreservasjon f = new Flyreservasjon(s1, s2); f.brukerdialog();

class Flyreservasjon class Flyreservasjon { HashMap fly = new HashMap(); HashMap<String, Flyvning> flyvninger = new HashMap<String, Flyvning>(); Flyreservasjon(String s1, String s2) { lesfly(s1); lesreservasjoner(s2); void lesfly(string filnavn) {... void lesreservasjoner(string filnavn) {... void brukerdialog() {...... Datastruktur Her kommer det metoder som skal kalles fra brukerdialogen Konstruktør som gjør initialisering (her: lese data fra fil) Metoder for å lese fra fil og for å lese inn kommando fra bruker

Flyreservasjon: brukerdialogen For hver kommando skal brukerdialogen kalle på en metode i klassen Flyreservasjon Sørg for å deklarere alle de metodene som du kaller på fra brukerdialog-metoden Du kan vente med å fylle inn innholdet i disse metodene Eksempel: kaller brukerdialogen på metoden visflyvning(), kan du skrive en dummy-metode : void visflyvning() { System.out.println( Metoden visflyvning utført );

Skrive ut flyvning Lag kode for metodene som kalles fra brukerdialogen Eksempel (i klassen Flyreservasjon): void visflyvning() { System.out.println( Flyvning: ); String flightkode = tast.inline(); Flyvning flight = <finn flyvingen ved oppslag i flyvninger>; flight.skrivut(); Oppdraget delegeres videre til en metode i Flyvning-objektet som er aktuelt.

class Flyvning Skriver ut litt informasjon om flyvningen og delegerer så ansvaret for utskrift av oppsettet i flyet til klasen fly. class Flyvning { String flightkode; String avreisested; String destinasjon; Fly fly; void skrivut() { System.out.println( Flight: + flightkode); System.out.println( Fra: + avreisested); System.out.println( Til: + destinasjon); fly.skrivut(); Oppdraget delegeres videre til en metode i Fly-objektet

class Fly Skriver ut informsjon on flyet Delegerer videre til seteradene Delegerer videre til setene. class Fly { String flykode; Seterad[] seterader; int skrivut() { System.out.println( Flykode: + flykode); for(int i=0; i<seterader.length; i++){ seterader[i].skrivut(); Og Fly delergerer videre

class Flyreservasjon { void brukerdialog() {... visflyvning();... void visflyvning() {... flight.skrivut();... Vi har ett objekt av denne. class Flyvning { skrivut() {...... fly.skrivut(); Vi har flere objekter av disse. class Fly{ skrivut() {...