Programuppbyggnad från komponenter (en liten orientering)

Relevanta dokument
Samlingar Collection classes

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Tentamen Objekt-orienterad programmering med Java, 1DL100 Sommarkurs och distanskurs

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Föreläsning 2. Länkad lista och iterator

Grafiska komponenter.

OOP Objekt-orienterad programmering

Interfacen Set och Map, hashtabeller

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Frames, menyer och GUI-program

Samlingar Collection classes

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Föreläsning 2. Länkad lista och iterator

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Länkade strukturer. (del 2)

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

Programmering för språkteknologer II, HT2014. Rum

Programmering för språkteknologer II, HT2011. Rum

DAT043 - föreläsning 8

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

Lösningar för tenta 3 DAT043,

Fortsättningskurs i programmering F 5. GUI händelsehantering - undantagshantering Hugo Quisbert AWT. Paket för hantering av grafik

DAT043 Objektorienterad Programmering

Repetition av OOP- och Javabegrepp

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Repetition av OOP- och Javabegrepp

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Föreläsning 10 Innehåll

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Diskutera. Hashfunktion

Föreläsning 10 Innehåll. Diskutera. Hashtabeller. Hashfunktion. hashfunktion. hashkod (ett heltal)

Föreläsning 9 Innehåll

Konstruktion av klasser med klasser

Tentamen FYTA11 Javaprogrammering

Föreläsning 11 Innehåll

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Föreläsning 14 Innehåll

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

Inlämningsuppgift och handledning

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Föreläsning 2 Innehåll

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Föreläsning 10. ADT:er och datastrukturer

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Collection classes. Interface, första exempel. Interface (forts) Men först

Collection Classes. bjectorienterad programmering Sida 1

Den som bara har en hammare tror att alla problem är spikar

Arrayer. results

Inlämningsuppgift och handledning. Föreläsning 11 Innehåll. Diskutera. Hashtabeller

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Objektorienterad Programmering (TDDC77)

Laboration A Objektsamlingar

Tommy Färnqvist, IDA, Linköpings universitet

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP och DSV1:P2

Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Laboration 24 Databasen MySQL och java

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Föreläsning 14. Filhantering

Föreläsning 8. Mängd, Avbildning, Hashtabell

17.9 Funktioner för avbildningstabeller

Saker du ska kunna Föreläsning 13 & 14

Objektorienterad programmering i Java

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Generisk klass med typparameter Inre klass - ListIterator

Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Tentamen, EDAA20/EDA501 Programmering

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Outline. Objektorienterad Programmering (TDDC77) Abstrakta klasser. Abstrakta metoder. Abstrakta klasser. Gränssnitt. Uppräkningar (enum) Ahmed Rezine

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

Objektorienterad Programkonstruktion

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Föreläsning 4 Innehåll

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Lösningar för tenta 2 DAT043,

Föreläsning 2 Innehåll. Generiska klasser. Generik i Java. Varför generiska klasser Bakgrund

TDDD78 Viktiga begrepp, del 2

Föreläsning REPETITION & EXTENTA

Föreläsning 4 Datastrukturer (DAT037)

TENTAMEN OOP

Transkript:

Programuppbyggnad från komponenter (en liten orientering) Exempel från tre områden: grafiska användargränssnitt sparande på filer datasamlingsklasser Texten till labb 8 finns sist i häftet, den finns även på http://dsv.su.se/courses/pm2/introit/index.html med klickbara hänvisningar till dokumentation Bild 1

Grafiska användargränssnitt - en (konstig) texteditor i 5 steg Editerbar text. I textfältet kan man mata in text, klickar man på Insert så läggs texten in sist i textarean, klickar man på Save så sparas texten från arean på en fil med namnet från textfältet och klickar man på Open så hämtas text från en fil med namnet från textfältet. Fullständig programkod finns i häftet efter OH-bilderna Bild 2

Första steget import java.awt.*; class TextEd1{ Frame win = new Frame("TextEditor"); TextArea ta = new TextArea(); TextEd1(){ win.add(ta, "Center"); win.setsize(400, 200); win.show(); } // Konstruktor public static void main(string[] args){ new TextEd1(); } // main } // TextEd1 Bild 3

AWT-komponenter (ett urval) Button Label TextField Checkbox Panel TextArea Frame Choice List Bild 4

AWT komponenthierarkin Component Button Label List Checkbox Canvas Choice TextComponent TextField TextArea Container Window Panel Dessutom finns: MenuBar, Menu, MenuItem och MenuShortcut samt PopupMenu. Dessa klasser finns i paketet java.awt I javax.swing finns det fler komponenter samt alternativ till AWT-komponenterna Frame Dialog FileDialog Bild 5

Exempel på viktiga metoder Alla komponenter void setbackground(color color) void setforeground(color color) Färgen anges med ett objekt av klassen Color med Red, Green, Blue-värden (mellan 0 och 255) eller med en Color-konstant, t.ex. ta.setbackground(new Color(130, 17, 255)); ta.setforeground(color.red); TextArea och TextField String gettext() - returnerar textinnehållet som sträng void settext(string str) - sätter textinnehållet Exempel: String s = ta.gettext(); ta.settext( ); tf.settext( Hej hopp! ); TextArea (bara) void append(string str) - adderar strängen på slutet Button void addactionlistener(actionlistener l) - action framkallas av att användaren klickar på knappen Bild 6

Kommunikation fönster/komponenter/tillämpning x Händelser A B C Namn: Jozef Vissa händelser Vissa händelser Tillämpning (objekt av TextEditorklassen) Bild 7

Objektexempel Frame addwindowlistener setsize show Button TextArea TextField addactionlistener Insert gettext settext gettext settext TextEditor InsertLyssnare actionperformed ta tf KryssLyssnare win windowclosing Bild 8

import java.awt.*; import java.awt.event.*; class TextEd2{ Frame win = new Frame("TextEditor"); TextArea ta = new TextArea(); TextEd2(){ win.add(ta, "Center"); win.addwindowlistener(new KryssLyssnare()); win.setsize(300, 200); win.show(); } // Konstruktor public static void main(string[] args){ new TextEd2(); } // main class KryssLyssnare extends WindowAdapter{ public void windowclosing(windowevent wev){ System.exit(0); } // windowclosing } // KryssLyssnare } // TextEd2 Bild 9

Fönsterlayout North West Center East South Bild 10

... import som förut class TextEd3{... som förut TextField tf = new TextField(20); Button ib = new Button("Insert"); TextEditor(){ win.add(ta, "Center"); Panel north=new Panel(); win.add(north, "North"); north.add(tf); north.add(ib); ib.addactionlistener(new InsertLyssnare());... som förut } // Konstruktor... main och KryssLyssnare som förut class InsertLyssnare implements ActionListener{ public void actionperformed(actionevent ave){ String str = tf.gettext(); if (str.length() > 0){ ta.append(str); tf.settext(""); } // if } // actionperformed } // InsertLyssnare } // TextEd3 Bild 11

import som förut... import java.io.*; class TextEd4{... som förut Button sb = new Button("Save"); TextEd4(){... som förut north.add(sb); sb.addactionlistener(new SaveLyssnare());... som förut } // Konstruktor... main, KryssLyssnare och InsertLyssnare som förut class SaveLyssnare implements ActionListener{ public void actionperformed(actionevent ave){... se nästa bild } // SaveLyssnare } // TextEd4 Bild 12

class SaveLyssnare implements ActionListener{ public void actionperformed(actionevent ave){ String filnamn=null; try{ filnamn=tf.gettext(); ObjectOutputStream oos=new ObjectOutputStream( new FileOutputStream(filnamn)); String str = ta.gettext(); oos.writeobject(str); }catch(ioexception e){ System.out.println("Kan inte skriva på "+filnamn); } // catch } // actionperformed } // SaveLyssnare Bild 13

import som förut... class TextEditor{... som förut Button ob = new Button("Open"); TextEditor(){... som förut north.add(ob); ob.addactionlistener(new OpenLyssnare());... som förut } // Konstruktor... main och lyssnarklasser som förut class OpenLyssnare implements ActionListener{ public void actionperformed(actionevent ave){... se nästa bild } // actionperformed } // OpenLyssnare } // TextEditor Bild 14

class OpenLyssnare implements ActionListener{ public void actionperformed(actionevent ave){ String filnamn=null; try{ filnamn=tf.gettext(); ObjectInputStream ois = new ObjectInputStream( new FileInputStream(filnamn)); String str = (String)ois.readObject(); ta.settext(str); }catch(ioexception e){ System.out.println("Kan inte läsa "+filnamn); }catch(classnotfoundexception e){ System.out.println("Kan inte läsa "+filnamn); } // catch } // actionperformed } // OpenLyssnare Bild 15

Viktiga metoder i klassen List List void add(string item) - adderar till slutet på listan String getselecteditem() - returnerar markerad sträng void select(int index) - markerar strängen med detta nr void deselect(int index) - avmarkerar strängen med detta nr void remove(string item) - tar bort strängen från listan void remove(int index) - tar bort strängen med detta nr void removeall() - tömmer listan void addactionlistener(actionlistener l) - action framkallas av att användaren dubbelklickar på en sträng Exempel: class ListLyssnare implements ActionListener{ public void actionperformed(actionevent ave){ String item = ls.getselecteditem(); ta.append(item); } // actionperformed } // ListLyssnare Bild 16

Klassen FileDialog FileDialog ger systemets vanliga fildialog. Vid skapande måste den ges referens till huvudfönstret (av klassen Frame), den kan även ges en titel och en av konstanterna FileDialog.LOAD eller FileDialog.SAVE (så att den anpassas till öppningsdialog resp. sparandedialog), t.ex. FileDialog fd = new FileDialog(win); eller FileDialog fd = new FileDialog(win, Save as?, FileDialog.SAVE); Dialogen visas efter anrop av metoden show(), t.ex.: fd.show(); Innan anropet av show() kan man sätta in ett förslag på filnamn, t.ex.: fd.setfile( minfil.txt ); Dialogen avslutas när användaren har valt en fil eller tryckt på en av knapparna. Därefter kan man hämta filnamnet och sökvägen till katalogen, t.ex. för att öppna en fil med detta namn. Om användaren har tryckt på Cancel -knappen blir filnamnet null. Exempel: String filename = fd.getfile(); if (filename!= null) { String path = fd.getdirectory(); ObjectInputStream oos = new ObjectInputStream( new FileInputStream(path + filename); Bild 17

Datasamlingsklasser De allra flesta program behöver hantera samlingar av data Man kan använda arrayer för datasamlingar, men då måste man själv implementera de vanligaste operationerna: utöka arrayen vid behov - skapa ny array och kopiera de gamla värdena lägga till nya värden i slutet, hålla reda på antalet inlagda värden lägga till nya värden i mitten, flytta fram övriga värden för att ge plats ta bort något värde, flytta tillbaka övriga värden ett steg kontrollera om ett visst värde finns i arrayen lägga till alla värden som finns i en array till en annan array osv I Javas klassbibliotek finns därför klassen ArrayList som innehåller en sådan array och implementerar sådana operationer. Det finns även några andra klasser för datasamlingar, samtliga i paketet java.util Bild 18

ArrayList - exempel med objekt av egen klass import java.util.*; class Person{ String namn; int pengar; Person(String n, int p) { namn=n; pengar=p;} int getpengar() { return pengar; } } // Person class Test{ public static void main(string[] args){ ArrayList lärare = new ArrayList(); ArrayList studenter = new ArrayList(); Person p1 new Person( Jozef, 5); Person p2 = new Person( Linda, 100); lärare.add(p1); // Jozef-objektet till lärarna studenter.add(p2); // Linda-objektet till studenterna studenter.remove(p2); // Flytta Linda till lärarna lärare.add(p2); ArrayList fest=new ArrayList(); fest.addall(lärare); // Ta med alla lärare fest.addall(studenter); //...och även studenterna if (fest.contains(p1)) // Fast om Jozef är med... fest.remove(p2); //...så kan man inte bjuda Linda Bild 19

Object-referenser i ArrayList ArrayList (liksom andra datasamlingsklasser) måste kunna hantera data av godtycklig typ. Hur kan då den interna arrayen vara deklarerad? Av vilken typ får argument till metoderna (t.ex. add, remove, contains) vara? I Java finns klassen Object som alla klasser är subklasser till (även arrayer). En Object-referens kan därför peka ut objekt av alla klasser. Den interna arrayens element och argumenten till metoderna är alltså Object-referenser! Fyra viktiga konsekvenser: objekt av alla klasser kan hanteras i en ArrayList endast klassobjekt och arrayer kan hanteras, inga värden av primitiva datatyper! Lösning: omslagsklasser: Integer, Double osv: ArrayList minatal = new ArrayList(); minatal.add(new Integer(13)); objekt av olika typer kan blandas i samma ArrayList (både för- och nackdel) när man hämtar ett objekt från en ArrayList vet man inte vad det är! Bild 20

Attributsynlighet vid Object-referenser Person pers = new Person( Jozef, 5); Object obj = pers; pers obj getpengar namn: Jozef pengar: 5 int x = pers.getpengar(); // Går bra int y = obj.getpengar(); // Kompileringsfel!!! Kompilatorn vet inte att obj pekar ut ett Personobjekt, så den vägrar att acceptera anropet till getpengar (namn, pengar och getpengar syns inte ) Man kan dock tvinga kompilatorn genom explicit konvertering: int y = ((Person)obj).getPengar(); // Går bra! Bild 21

Konsekvens för datasamlingar När man hämtar en objektreferens från en datasamling måste referensen konverteras till objektets förväntade typ innan man kan göra operationer på objektet. Det går att testa typen med instanceof-operatorn, men det fallar utanför ramen för denna föreläsning. Exempel: ArrayList har metoden Object get(int index) som returnerar referensen till objektet på plats nr index. Man kan använda denna metod för att skriva ut vare lärares pengar: for(int i=0; i<lärare.size(); i++) { // Obs! metoden size() Person p = (Person)lärare.get(i); // Obs! konvertering System.out.println(p.namn+ har +p.getpengar()+ kronor ); } // for Bild 22

Likhet mellan objekt: klass utan omdefinierad equals ArrayList lärare=new ArrayList(); Person pers1=new Person( Linda, 100); lärare.add(pers1); Person pers2=new Person( Linda, 100); lärare pers2 getpengar namn: Linda pengar: 100 getpengar namn: Linda pengar: 100 if (lärare.contains(pers2))... // Ger false! Två Personobjekt är inte samma bara för att de innehåller lika värden. Bild 23

Likhet mellan objekt: klass med omdefinierad equals ArrayList ord=new ArrayList(); String str1= datalogi ; ord.add(str1); String str2= datalogi ; ord str2 datalogi datalogi if (ord.contains(str2))... Två strängar är samma om de har samma värde! // Ger true! contains använder objektens equals-metod för att avgöra om två objekt är lika. String-klassen definierar om equals-metoden så att den jämför värden i objekten. På detta sätt kan samma datasamlingsklasser fungera olika för olika elementtyper (anpassas till behov). Motsvarande gäller för datasamlingsklasser som kräver jämförelse för mindre än eller större än (för att kunna sortera elementen). Bild 24

Något om implementeringstekniker I Array (utökningsbar) Snabb indexering, snabba tillägg/borttag i slutet, långsamma tillägg/borttag i början och mitten. Sökning genom iterering (långsamt) Kräver endast equals av objekten Används i klassen ArrayList 0 1 2 3 4 equals equals Länkad lista Långsam indexering, snabba tillägg/borttag. Sökning genom iterering (långsamt) Kräver endast equals av objekten Används i klassen LinkedList equals equals equals Bild 25

Något om implementeringstekniker II Balanserat binärt sökträd Ganska snabba sökningar, tillägg och borttag. Objekten i sorteringsordning, måste kunna jämföras. Används i klassen TreeSet och i klassen TreeMap A compareto C compareto B compareto E compareto D compareto Hashtabell Använder hashcode() * som index i en tabell. Snabb sökning, tillägg och borttag. Oordnad. Används i HashSet och HashMap * Egentligen hashcode() % capacity 0 1 2 3 4 5 X hashcode K hashcode A hashcode Bild 26

Javas datasamlingsklasser ArrayList - arrayimplementering, tillåter dubletter, har positionsoperationer (get(int index), add(int index, object ny), remove(int index) osv) LinkedList - länkad implementering, tillåter dubletter, har positionsoperationer HashSet - TreeSet - HashMap - TreeMap - hashtabell-implementering, tillåter inte dubletter, har inga positionsoperationer, håller elementen osorterade träd-implementering, tillåter inte dubletter, har inga positionsoperationer, håller elementen sorterade, kräver att elementen skall kunna jämföras med compareto identifierar elementen med nycklvärden, implementerad med hashtabell, håller elementen osorterade identifierar elementen med nycklvärden, implementerad med trädstruktur, håller elementen sorterade efter nyckelvärden, kräver att nyckelvärden skall kunna jämföras med compareto Bild 27

Implementationsoberoende genomgång Vid genomgång av alla element i en datasamling blir operationen ta fram nästa element olika för olika implementeringar. För att man skall kunna hantera alla datasamlingsklasser (utom Map-klasser) på samma sätt kan man hos ett objekt av en datasamlingsklass begära att få ett iterator -objekt. Iteratorobjektet har främst två metoder: boolean hasnext() - returnerar true om det finns ett nästa element Object next() - returnerar referensen till nästa element För objekt av klasserna ArrayList, LinkedList, HashSet och TreeSet kan genomgång av alla element göras på samma sätt, enligt följande exempel: skriv ut alla lärares namn och pengar (igen): Iterator iter = lärare.iterator(); while (iter.hasnext()){ Person p = (Person)iter.next(); System.out.println(p.namn+ : +p.getpengar()+ kr ); } // while Bild 28

Map-klasserna Klasserna HashMap och TreeMap upprätthåller en avbildning av nycklar (som kan vara godtyckliga objekt) på värden (som också kan vara godtyckliga objekt). Den viktigaste skillnaden mellan dem är att HashMap håller nyckel-värde-paren osorterade medan TreeMap håller dem sorterade i nyckel-ordning. De viktigaste metoderna i Map-klasserna är Object put(object key, Object value) - stoppar in objektet value identifierat med objektet key. Om key fanns redan så bytes värdeobjektet, det gamla värdeobjektet returneras Object get(object key) - returnerar referensen till värdeobjektet för denna nyckel eller null om nyckeln inte fanns Object remove(object key) - tar bort nyckeln och värdet och returnerar värdet (eller null om nyckeln inte fanns) Bild 29

TreeMap - användningsexempel import java.util.*; class Lexicon{ public static void main(string[] args){ TreeMap lexicon=new TreeMap(); lexicon.put("hund", "dog"); lexicon.put("katt", "cat"); lexicon.put("dator", "computer"); lexicon.put("grunka", "gadget"); String svenska=lasin.lässträng("uppslagsord: "); while (svenska.length() > 0) { String engelska = (String)lexicon.get(svenska); if (engelska == null) System.out.println("Finns inte i ordboken!"); else System.out.println("Engelska: " + engelska); svenska = LasIn.läsSträng("Uppslagsord: "); } // while Bild 30

Map-klasser: genomgång av nycklar eller värden Man kan inte direkt gå igenom alla nyckel-värde-paren, alla nycklar eller alla värden i ett objekt av klasserna HashMap eller TreeMap. Istället har dessa klasser metoder som returnerar datasamlingar med referenser till dessa objekt: keyset() - returnerar en datasamling med referenser till alla nycklar values() - returnerar en datasamling med referenser till alla värden entryset() - returnerar en datasamling med referenser till alla nyckel-värde-par Man kan sedan gå igenom den returnerade datasamling med hjälp av en iterator, t.ex.: skriv ut alla svenska uppslagsord ur lexikonet: Iterator iter = lexicon.keyset().iterator(); while (iter.hasnext()){ String svord = (String)iter.next(); System.out.println(svord); } // while För en HashMap skulle genomgången bli i slumpmässig ordning, för en TreeMap i sorteringsordning (eftersom nycklar här är strängar blir det alfabetisk ordning). Bild 31