Kapittel 9: Dynamiske datastrukturer - del I. Java som første programmeringsspråk

Like dokumenter
Kapittel 9: Dynamiske datastrukturer - del I. Java som første programmeringsspråk

Kapittel 10: Bruk av dynamiske datastrukturer

Kapittel 10: Bruk av dynamiske datastrukturer

Læringsmål for forelesningen

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

Kapittel 9: Sortering og søking Kort versjon

Kapittel 8: Sortering og søking

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

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Kapittel 8: Sortering og søking INF100

Kapittel 9: Sortering og søking Kort versjon

Kapittel 8: Sortering og søking INF100

Kapittel 9: Sortering og søking Kort versjon

Kapittel 9: Sortering og søking Kort versjon

Kapittel 5: Objektkommunikasjon

Kapittel 8: Programutvikling

Kapittel 7: Mer om arv

UNIVERSITETET I OSLO

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

IN1010 våren januar. Objektorientering i Java

Tillatte hjelpemidler: alle skrevne og trykte. Antall sider: 2 (+ 1 side vedlegg, bakerst). Oppgave 1 [25%]

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

INF1010. Stein Michael Storleer (michael) Lenkelister

INF Løsning på seminaropppgaver til uke 8

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

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

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

INF1010, 23. februar Parametriserte klasser Om å gå gjennom egne beholdere (subklasser og grensesnitt 3)

UNIVERSITETET I OSLO

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 Forelesning 9. Hashmap Eksempel: Flyreservasjon

UNIVERSITETET I OSLO

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

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

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

PG4200 Algoritmer og datastrukturer Lab 1. 8.januar I dag skal vi undersøke en rekke velkjente databeholdere i Java:

Kapittel 13: Grafiske brukergrensesnitt INF 100. Java som første programmeringsspråk

TOD063 Datastrukturer og algoritmer

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

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

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

UNIVERSITETET I OSLO

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

Liste som abstrakt konsept/datatype

Kapittel 15: Grafiske brukergrensesnitt: Enkel GUI. Del I

INF Algoritmer og datastrukturer

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

Kapittel 15: Grafiske brukergrensesnitt: Enkel GUI. Del I

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

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

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

Klasser og objekter. Tuva Kristine Thoresen 22. oktober Institutt for Informatikk

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

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

Forelesning inf Java 4

INF Uke 10. Ukesoppgaver oktober 2012

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Generelle Tips. INF Algoritmer og datastrukturer. Åpen og Lukket Hashing. Hashfunksjoner. Du blir bedømt etter hva du viser at du kan

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

AlgDat - Øvingsforelesning 1 Introduksjon til Python, lenkede lister og øving 1

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

UNIVERSITETET I OSLO

Løsningsforslag til eksamen i INF1000 våren 2006

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

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

OPPGAVE 5b og 8b Java Kode

EKSAMEN I FAG TDT4100 Objektorientert programmering. Fredag 2. juni 2006 Kl

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

Eksamensoppgave i IFUD1025 Programmering i Java

INF1000 HashMap. Marit Nybakken 2. november 2003

UNIVERSITETET I OSLO

INF1010 våren februar. Arv og subklasser, del 2

Post-it spørsmål fra timen (Arv og subklasser)

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

INF2220: Forelesning 3. Map og hashing Abstrakte datatyper (kapittel 3.1) Map (kapittel 4.8) Hashing (kapittel 5)

MENGDER (SETS) Læringsmål og pensum. Kapittel 9.2

HØGSKOLEN I SØR-TRØNDELAG

Løsningsforslag Test 2

INF2220: Forelesning 3

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

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

Introduksjon til objektorientert programmering

Objekter og referanser

TDT4110 Informasjonsteknologi grunnkurs: Tema: Dictionaries og mengder (sets) - Kapittel 9. Professor Alf Inge Wang

Kapittel 6: Arv. Redigert av: Khalid Azim Mughal

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

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

Transkript:

Kapittel 9: Dynamiske datastrukturer - del I Forelesningsnotater for: Java som første programmeringsspråk Khalid Azim Mughal, Torill Hamre, Rolf W. Rasmussen Cappelen Akademisk Forlag, 2003. ISBN 82-02-23274-0 http://www.ii.uib.no/~khalid/jfps/ Vi gir tillatelse til å bruke disse notatene i tilknytning til boken. Modifisert: 16/1/06 JFPS 9: Dynamiske datastrukturer - del I 9-1/29

Emneoversikt Dynamiske datastrukturer Abstrakte datatyper (ADT er) Dynamiske strenger: StringBuffer Samlinger og kontraktene Collection, List og Set: Dynamiske tabeller: ArrayList Mengder: HashSet Nøkkeltabeller og kontrakten Map: Nøkkeltabeller: HashMap JFPS 9: Dynamiske datastrukturer - del I 9-2/29

Dynamiske datastrukturer En samling er en datastruktur for oppbevaring av data, f.eks. tabeller definerer samlinger som har fast lengde. Dynamiske datastrukturer kan vokse og krympe ettersom data blir satt inn i og hentet fra strukturen. Kontrakten angir hvilke operasjoner som kan utføres på strukturen. Klienter trenger ikke å vite hvordan den er implementert. To vanligste operasjoner: Innsetting: sette inn data i strukturen. Oppslag: hente ut data fra strukturen. Valg av datastruktur er i stor grad betinget av hvor kostbart det er å utføre innsetting og oppslag. Abstrakte datatyper: ADT = datastruktur + kontrakt Resultat av data abstraksjon er ADT er, dvs. utforming av en ny type med tilhørende data representasjon og operasjoner. I Java er ADT er klasser. JFPS 9: Dynamiske datastrukturer - del I 9-3/29

Dynamiske strenger: StringBuffer-klassen Innholdet av et String-objekt kan ikke endres, dvs. tilstanden kan bare leses. Java har en predefinert klasse StringBuffer for å håndtere sekvenser av tegn som kan endres, og der antall tegn kan dynamisk vokse og krympe. Et objekt av klassen StringBuffer holder rede på størrelse (hvor mange tegn den inneholder til enhver tid), og kapasitet (hvor mange tegn som kan innsettes i den før den blir full) Dersom det ikke er plass til flere tegn, utvider den kapasiteten automatisk. Velg klassen Stringbuffer fremfor klassen String dersom tegnsekvens endres hyppig. Java har støtte for deklarasjon, opprettelse og bruk av dynamiske strenger. Deklarasjon: StringBuffer buffernavn; deklarasjonen oppretter en referanse for et StringBuffer-objekt. StringBuffer strbuffer; fører til opprettelse av en referanse for et StringBuffer-objekt: Navn: strbuffer null Type: ref(stringbuffer) JFPS 9: Dynamiske datastrukturer - del I 9-4/29

Dynamiske strenger: Opprettelse StringBuffer-objektet kan opprettes ved å anvende new-operatoren på en StringBuffer-konstruktør. Vi kan kombinere deklarasjon med opprettelse: StringBuffer buffernavn = new StringBuffer(argument-liste); // Oppretter et StringBuffer-objekt som har ingen tegn og lengde 0, // men kapasitet på 16: StringBuffer navnbuffer = new StringBuffer(); // Oppretter et StringBuffer-objekt som har ingen tegn og lengde 0, // men kapasitet på 10: StringBuffer adrbuffer = new StringBuffer(10); // Oppretter et StringBuffer-objekt fra en strenglitteral, // med kapasitet på strenglengde + 16, dvs 20 tegn i dette tilfellet: StringBuffer fargebuffer = new StringBuffer("rødt"); // Oppretter et StringBuffer-objekt fra et String-objekt. StringBuffer strbuffer = new StringBuffer(str); JFPS 9: Dynamiske datastrukturer - del I 9-5/29

Operasjoner på strengbuffere StringBuffer kursbuffer = new StringBuffer("databehandling"); Selektorer for StringBuffer-klassen: Hvert StringBuffer-objekt har en instansmetode, length(), som returnerer antall tegn i strengbufferen (størrelse). Metodekall kursbuffer.length() returnerer antall tegn i StringBuffer-objektet kursbuffer, dvs. 14. Hvert StringBuffer-objekt har en instansmetode, capacity(), som returnerer antall tegn som kan settes inn i strengbufferen før den utvides for å lagre flere tegn (kapasitet). Metodekall kursbuffer.capacity() returnerer antall tegn som kan lagres totalt i StringBuffer-objekt kursbuffer, dvs. 30. Metoden charat(int i) returnerer tegn gitt ved indeks i i strengen. Metodekall kursbuffer.charat(4) returnerer tegn 'b' i StringBuffer-objekt kursbuffer. Startindeks er 0. Ulovlig indeksverdi resulterer i StringIndexOutOfBoundsException. JFPS 9: Dynamiske datastrukturer - del I 9-6/29

StringBuffer-objekt StringBuffer buffer = new StringBuffer("bana"); buffer :StringBuffer 0 1 2 3 4... 18 19 b a n a length() capacity() append(...) charat(...)... Strengbuffer buffer har 4 tegn innsatt, og plass til 16 til - og kan vokse dersom det er nødvendig. JFPS 9: Dynamiske datastrukturer - del I 9-7/29

Operasjoner på strengbuffere (forts.) Modifikatorer for StringBuffer-klassen: Tegn kan innsettes hvor som helst i strengbufferen. Innsetting kan føre til at andre tegn flyttes for å gjøre plass til det nye tegnet. Størrelsen justeres automatisk ved innsetting. Den overlastede metoden append() kan brukes til å tilføye primitive verdier, Stringobjekter, tabeller av tegn og tekstrepresentasjon av andre objekter på slutten av strengbufferen. StringBuffer buffer = new StringBuffer("bana"); buffer.append("na"); // tilføyer en streng på slutten av strengbufferen: "banana" buffer.append(42); // tilføyer et tall på slutten av strengbufferen: "banana42" StringBuffer strbuffer = new StringBuffer().append(4).append("U").append("Only"); String str = 4 + "U" + "Only"; // bruker en StringBuffer implisitt Den overlastede metoden insert() kan brukes til å innsette primitive verdier, Stringobjekter, tabeller av tegn og andre objekter ved en gitt indeks i strengbufferen. buffer.insert(6, "Rama"); // "bananarama42" buffer.insert(11, U ); // "bananarama4u2" buffer.setcharat(6, m ); // "bananamama4u2" StringbufferKlient.java viser flere operasjoner på strengbuffere. JFPS 9: Dynamiske datastrukturer - del I 9-8/29

Operasjoner på strengbuffere (forts.) Klassen StringBuffer overkjører ikke equals()-metoden fra Object-klassen. Strengbuffere må oversettes til strenger for å sammenligne dem: boolean status = buffer1.tostring().equals(buffer2.tostring()); JFPS 9: Dynamiske datastrukturer - del I 9-9/29

Samlinger En samling er en datastruktur som kan holde rede på referanser til andre objekter. For eksempel, en tabell med referanser til objekter er en samling. Java API definerer flere andre typer samlinger i java.util-pakken. Sentralt i java.util-pakken er noen få viktige generiske kontrakter som samlingene implementerer. «kontrakt» Collection<E> «kontrakt» Set<E> «kontrakt» List<E> mengde HashSet<E> ArrayList<E> dynamisk tabell JFPS 9: Dynamiske datastrukturer - del I 9-10/29

Kontrakten Collection<E> Basisoperasjoner er de vanligste som utføres på samlinger: innsetting, sletting og kontroll av medlemskap. int size() boolean isempty() Utvalgte basisoperasjoner fra kontrakten Collection<E> boolean contains(object element) boolean add(e element) boolean remove(object element) Returnerer antall elementer i samlingen. Finner ut om samlingen er tom. Finner ut om element er med i samlingen. Innsetting: prøver å tilføye element til samlingen og returnerer sann dersom dette lykkes. Sletting: prøver å slette element fra samlingen og returnerer sann dersom dette lykkes. Bulkoperasjoner utføres på hele samlinger. JFPS 9: Dynamiske datastrukturer - del I 9-11/29

Utvalgte bulkoperasjoner fra kontrakten Collection<E> boolean containsall(collection<?> s) boolean addall(collection<? extends E> s) boolean retainall(collection<?> s) boolean removeall(collection<?> s) void clear() Delmengde: returnerer sann dersom alle elementer i samling s er i denne samlingen. Union: tilføyer alle elementer fra samlingen s til denne samlingen og returnerer sann dersom denne samlingen ble endret. Snitt: beholder i denne samlingen kun de elementene som også er i samlingen s, og returnerer sann dersom denne samlingen ble endret. Differanse: sletter alle elementer i denne samlingen som også er i samlingen s, og returnerer sann dersom denne samlingen ble endret. Sletter alle elementer fra denne samlingen. Merk at metodene addall(), retainall() og removeall() er destruktive, dvs at de kan endre den aktuelle samlingen. JFPS 9: Dynamiske datastrukturer - del I 9-12/29

Mengdelæren A B A = [kiss, Sivle, madonna, aha, abba] B = [TLC, wham, madonna, abba] (a) A A A A.addAll(B) A = [kiss, TLC, Sivle, wham, aha, madonna, abba] A.retainAll(B) A = [madonna, abba] A.removeAll(B) Etter utføring: Etter utføring: Etter utføring: A = [kiss, Sivle, aha] (b) Union (c) Snitt (d) Differanse JFPS 9: Dynamiske datastrukturer - del I 9-13/29

Traversering av en samling En for(:)-løkke kan brukes til å traversere en samling: // Opprett en dynamisk tabell. Collection<String> samling = new ArrayList<String>(); // Legg til elementer. samling.add("9"); samling.add("1"); samling.add("1"); // Traverser samlingen. for (String element: samling) { System.out.print(element); // Håndter inneværende element. } JFPS 9: Dynamiske datastrukturer - del I 9-14/29

Dynamiske tabeller: ArrayList<E> Subkontrakten List En samling som tillater duplikater, og hvor elementene er ordnet, kalles en liste. Kontrakten List utvider kontrakten Collection til å gjelde for lister. Elementene har en posisjon (angitt ved en indeks) i listen. E get(int indeks) E set(int indeks, E element) void add(int indeks, E element) E remove(int indeks) int indexof(object obj) Utvalgte listeoperasjoner i kontrakten List Returnerer element gitt ved indeks. Erstatter elementet gitt ved indeks med element. Returnerer elementet som ble erstattet. Innsetter element i angitt indeks. Elementene forskyves dersom det er nødvendig. Sletter og returnerer element i angitt indeks. Elementene forskyves dersom det er nødvendig. Returner indeks til første forekomst av obj dersom objektet finnes, ellers -1. JFPS 9: Dynamiske datastrukturer - del I 9-15/29

Dynamiske tabeller (DynamiskTabKlient.java) Programmet leser argumenter fra kommandolinjen inn i en dynamisk tabell (ordliste), og sladder ut spesifikke ord fra denne listen. Vi bruker en import-setning i begynnelsen av kildekodefilen, slik at vi slipper å bruke hele pakkestien for å referere til klasser fra java.util-pakken. Ord som skal sladdes, er gitt i en egen dynamisk tabell (sladdeteord). Ved (1) opprettes en tom dynamisk tabell for strenger: List<String> ordliste = new ArrayList<String>(); Ved (2) konstrueres det en dynamisk tabell (sladdeteord) med ord som skal sladdes. List<String> sladdeteord = new ArrayList<String>(); Ved (3) bruker vi en for(:)-løkke på ordlisten for å kontrollere hvert ord i den. for (String ord : ordliste) { if (sladdeteord.indexof(ord)!= -1) { int indeksiordlisten = ordliste.indexof(ord); ordliste.set(indeksiordlisten, SENSUR); } } JFPS 9: Dynamiske datastrukturer - del I 9-16/29

Mengder: HashSet<E> Subkontrakten Set<E> Kontrakten Set modellerer det matematiske mengdebegrepet som tillater operasjoner som union, snitt og differanse fra mengdelæren. En mengde tillater ikke duplikate verdier. Kontrakten Set introduserer ikke nye metoder utover dem som allerede finnes i kontrakten Collection, men spesialiserer disse for mengder. JFPS 9: Dynamiske datastrukturer - del I 9-17/29

Eksempel: Mengder (MengdeKlient.java) Eksempel: To mengder med artistnavn. En tom mengde for konsert A oppretter vi ved å instansiere klassen HashSet: Set<String> konserta = new HashSet<String>(); Vi tilføyer de forskjellige artistene ved å bruke add()-metoden: konserta.add("aha"); Dersom add()-metoden førte til at et element ble tilføyet mengden, returneres sannhetsverdien true. Sannhetsverdien false vil indikere at elementet allerede finnes i mengden. Koden nedenfor viser hvordan vi kan lage en kopi av en mengde ved å kalle riktig konstruktør i klassen HashSet<E>: Set<String> alleartister = new HashSet<String>(konsertA); JFPS 9: Dynamiske datastrukturer - del I 9-18/29

Eksempel: Lage en dynamisk tabell uten duplikater (Duplikater.java) Koden nedenfor vil lage en mengde (ordmengde) av String-objekter fra en dynamisk tabell (ordliste) av String-objekter og dermed fjerne duplikater: import java.util.*; public class Duplikater { public static void main(string args[]) { ArrayList<String> ordliste = new ArrayList<String>(); // Opprinnelig liste ordliste.add("to"); ordliste.add("null"); ordliste.add("null"); ordliste.add("fem"); System.out.println("Opprinnelig ordliste: " + ordliste); } } Set<String> ordmengde = new HashSet<String>(ordListe);// Ny mengde ordliste = new ArrayList<String>(ordMengde); // Listen uten duplikater. System.out.println("Opprinnelig ordliste, ingen duplikater: " + ordliste); Utdata fra programmet: Opprinnelig ordliste: [to, null, null, fem] Opprinnelig ordliste, ingen duplikater: [to, null, fem] JFPS 9: Dynamiske datastrukturer - del I 9-19/29

Nøkkeltabeller: HashMap<K,V> En nøkkeltabell brukes til å lagre bindinger. En binding er et par av objekter, der det ene objektet (kalt nøkkel) er assosiert med det andre objektet (kalt verdi). Eksempel: En telefonliste er en nøkkeltabell, der hver binding assosierer et telefonnummer (nøkkel) med et navn (verdi). Det er en mange-til-en-relasjon mellom nøkler og verdier i en nøkkeltabell: Forskjellige nøkler kan ha samme verdi, men forskjellige verdier kan ikke ha samme nøkkel. dvs. nøkler er entydige i en nøkkeltabell. JFPS 9: Dynamiske datastrukturer - del I 9-20/29

Kontrakten Map<K,V> Funksjonaliteten til nøkkeltabeller er spesifisert i kontrakten Map i java.util-pakken. Klassen HashMap er en konkret implementering av kontrakten Map. Vi kan opprette en tom nøkkeltabell for bindinger <String, Integer> slik: Map<String, Integer> ordtabell = new HashMap<String, Integer>(); «kontrakt» Map<K, V> HashMap<K, V> nøkkeltabell JFPS 9: Dynamiske datastrukturer - del I 9-21/29

int size() boolean isempty() V put(k nøkkel, V verdi) V get(object nøkkel) V remove(object nøkkel) boolean containskey(object nøkkel) boolean containsvalue(object verdi) Basisoperasjoner i kontrakten Map<K,V> Utvalgte basisoperasjoner fra kontrakten Map<K,V> Returnerer antall bindinger i nøkkeltabellen. Returnerer sann dersom nøkkeltabellen ikke har noen bindinger. Binder nøkkel til verdi og lagrer bindingen. Dersom nøkkel hadde en tidligere binding, returneres verdien fra den tidligere bindingen. Returnerer verdien fra bindingen som nøkkel har, dersom nøkkel var registrert fra før. Ellers returneres referanseverdien null. Prøver å slette bindingen til nøkkel og returnerer verdien i denne bindingen dersom nøkkel var registrert fra før. Returnerer sann dersom nøkkel har en binding. Returnerer sann dersom verdi er med i minst én binding. JFPS 9: Dynamiske datastrukturer - del I 9-22/29

Eksempel: Basisoperasjoner i kontrakten Map<K,V> Ord (nøkkel) da 3 var 2 det 2 og 1 Hyppighet (verdi) Metoden put() lager en binding og setter den inn i nøkkeltabellen: ordtabell.put("da", 3); // <"da", new Integer(3)> Metoden vil overskrive en tidligere binding til nøkkelen og returnere verdien fra den tidligere bindingen. Hente ut verdien til en nøkkel: int hyppighet = ordtabell.get("da"); // 3 Binding til en nøkkel kan slettes med remove()-metoden som returnerer verdien i bindingen. Om en verdi forekommer i én eller flere bindinger: boolean nøkkelfinnes = ordtabell.containskey("da"); // sann boolean verdifinnes = ordtabell.containsvalue(2001); // usann JFPS 9: Dynamiske datastrukturer - del I 9-23/29

Standard strengrepresentasjon av en nøkkeltabell: {da=3, var=2, det=2, og=1} JFPS 9: Dynamiske datastrukturer - del I 9-24/29

Nøkkeltabellutsnitt Et nøkkeltabellutsnitt er en samling som er assosiert med en underliggende nøkkeltabell. Ved hjelp av et slikt utsnitt kan vi for eksempel iterere over den underliggende nøkkeltabellen. Endringene som gjøres via et utsnitt, blir reflektert i den underliggende nøkkeltabellen. public Set<K> keyset() Utvalgte utsnittsoperasjoner fra kontrakten Map public Collection<V> values() (Nøkkelutsnitt) Returnerer Set-utsnitt av alle nøkler i nøkkeltabellen. (Verdiutsnitt) Returnerer Collection-utsnitt av alle verdier i alle bindinger i nøkkeltabellen. JFPS 9: Dynamiske datastrukturer - del I 9-25/29

Nøkkelutsnitt: Set<String> ordmengde = ordtabell.keyset(); // [da, var, det, og] Siden nøkler er entydige, er det hensiktsmessig å lage en mengde som ikke tillater duplikater. En for(:)-løkke kan brukes til å iterere over nøkler i denne mengden på vanlig måte. Metoden get() kan brukes på nøkkeltabellen for å hente ut den tilsvarende verdien til nøkkelen. Verdiutsnitt: Collection<Integer> antallsamling = ordtabell.values(); // [3, 2, 2, 1] Siden verdier ikke er entydige, er det hensiktsmessig å lage en samling som tillater duplikater. En for(:)-løkke kan brukes til å iterere over verdier i denne samlingen på vanlig måte. JFPS 9: Dynamiske datastrukturer - del I 9-26/29

Bruk av nøkkeltabeller (NoekkelTabKlient.java) Lesing av ord og innsetting i nøkkeltabellen: Gjenta mens flere argumenter i kommandolinjen: Gjør oppslag i nøkkeltabellen med inneværende argument. Hvis inneværende argument er ikke registrert: La hyppighet til inneværende argument være 1, dvs. 1. gang; ellers: Øk hyppighet til inneværende argument med 1. Sett inn inneværende argument med riktig hyppighet. // (2) Les ord fra kommandolinjen. for (String arg : args) { // Oppslag for å finne om et ord er registrert. Integer antallganger = ordtabell.get(arg); if (antallganger == null) antallganger = 1; // Ikke registrert før.første gang. else // Registrert. Teller økes med 1. antallganger++; ordtabell.put(arg, antallganger); } JFPS 9: Dynamiske datastrukturer - del I 9-27/29

Beregn antall ord som ble lest (4). Totalt antall ord innlest er lik summen av alle hyppigheter. Vi lager et verdiutsnitt, som brukes til å iterere over denne samlingen for å summere hyppigheter. Collection<Integer> antallsamling = ordtabell.values(); int totalantallord = 0; for (Integer antall : antallsamling) { totalantallord += antall; } Finn alle distinkte ord i nøkkeltabellen (5): Alle distinkte ord utgjør alle nøkler som er registrert. Lag et nøkkelutsnitt som er en mengde av alle ord (det vil si nøkler) fra nøkkeltabellen, og skriver den ut. Set<String> ordmengde = ordtabell.keyset(); JFPS 9: Dynamiske datastrukturer - del I 9-28/29

Finn alle ord som er dupliserte (6): Lag en tom mengde for dupliserte ord. Lag et nøkkelutsnitt som er en mengde over alle nøkler. Gjenta mens flere elementer i mengden med alle nøkler: Gjør oppslag i nøkkeltabellen med inneværende nøkkel. Hvis hyppighet ikke er lik 1, dvs. duplisert ord: Innsett ord i mengde over dupliserte ord. Collection<String> duplisertmengde = new HashSet<String>(); for (String nøkkel : ordmengde) { // ordmengde er et nøkkelutsnitt. int antallganger = ordtabell.get(nøkkel); if (antallganger!= 1) duplisertmengde.add(nøkkel); } JFPS 9: Dynamiske datastrukturer - del I 9-29/29