03.07.2013 Views

Datastructuren in de Java API - caagt

Datastructuren in de Java API - caagt

Datastructuren in de Java API - caagt

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Datastructuren</strong> <strong>in</strong> <strong>de</strong><br />

<strong>Java</strong> <strong>API</strong><br />

Collections<br />

ADTs Set en SortedSet<br />

ADT List<br />

ADTs Map en SortedMap<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.1/31


Collections <strong>in</strong> <strong>Java</strong><br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.2/31


Collections <strong>in</strong> <strong>Java</strong><br />

Wat zijn collections?<br />

algemeen bruikbare abstracte datatypes<br />

voor bijhou<strong>de</strong>n van gegevens <strong>in</strong> programma<br />

Typische bewerk<strong>in</strong>gen<br />

basisbewerk<strong>in</strong>gen: opzoeken, toevoegen,<br />

verwij<strong>de</strong>ren van element<br />

bulkbewerk<strong>in</strong>gen op een reeks elementen<br />

iteratoren: mechanisme om collectie te<br />

overlopen<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.3/31


Overzicht van <strong>API</strong>-<strong>in</strong>terfaces<br />

Collection: algemene collectie-objecten<br />

Set: ‘verzamel<strong>in</strong>g’ van objecten<br />

geen dubbels, volgor<strong>de</strong> onbelangrijk<br />

SortedSet: objecten <strong>in</strong> ‘stijgen<strong>de</strong>’ volgor<strong>de</strong><br />

List: ‘sequentie’ van objecten<br />

wel evt. dubbels, volgor<strong>de</strong> van objecten<br />

Map: ‘afbeeld<strong>in</strong>g’ van ‘sleutels’ op ‘waar<strong>de</strong>’<br />

SortedMap: sleutels <strong>in</strong> ‘stijgen<strong>de</strong>’ volgor<strong>de</strong><br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.4/31


Manier van werken<br />

Functionaliteit van ADTs bespreken<br />

<strong>API</strong>-<strong>in</strong>terfaces: Collection, List, Set,<br />

SortedSet, Map, SortedMap<br />

ADTs gebruiken <strong>in</strong> toepass<strong>in</strong>gen<br />

<strong>API</strong>-klassen: ArrayList, L<strong>in</strong>kedList, HashSet,<br />

TreeSet, HashMap, TreeMap<br />

Later: eenvoudige implementaties<br />

geschakel<strong>de</strong> lijsten, hashtabellen, b<strong>in</strong>aire<br />

zoekbomen<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.5/31


Interface Collection<br />

Basisbewerk<strong>in</strong>gen<br />

size, isEmpty<br />

conta<strong>in</strong>s, add, remove<br />

Bulkbewerk<strong>in</strong>gen<br />

conta<strong>in</strong>sAll, addAll, removeAll, reta<strong>in</strong>All, clear<br />

Iterator<br />

iterator<br />

Gelijkheid en hash<strong>in</strong>g<br />

equals, hashCo<strong>de</strong><br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.6/31


Het ADT Set<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.7/31


Het ADT Set<br />

ADT Set: ‘verzamel<strong>in</strong>g’ van objecten<br />

Interface Set: extensie van Collection<br />

geen bijkomen<strong>de</strong> bewerk<strong>in</strong>gen<br />

wel an<strong>de</strong>re, specifieke functionaliteit<br />

Implementaties <strong>in</strong> <strong>API</strong><br />

HashSet: via hashtabel (zie later)<br />

basisbewerk<strong>in</strong>gen <strong>in</strong> gemid<strong>de</strong>ld Θ(1)<br />

TreeSet: via b<strong>in</strong>aire zoekboom (zie later)<br />

basisbewerk<strong>in</strong>gen <strong>in</strong> Θ(log n)<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.8/31


Voorbeeld: werken met Set<br />

Zoeken van duplicaten <strong>in</strong> een rij str<strong>in</strong>gs<br />

Set zoekDuplicaten ( Str<strong>in</strong>g [ ] rij ) {<br />

}<br />

Set alle = new HashSet ( ) ;<br />

Set dubbels = new HashSet ( ) ;<br />

for ( <strong>in</strong>t i=0; i


Voorbeeld: bulkbewerk<strong>in</strong>gen<br />

Zoeken van unieke str<strong>in</strong>gs <strong>in</strong> een rij<br />

Set zoekUnieke ( Str<strong>in</strong>g [ ] rij ) {<br />

}<br />

Set res = new HashSet ( ) ;<br />

Set dubbels = new HashSet ( ) ;<br />

for ( <strong>in</strong>t i=0; i


Werken met iteratoren /<br />

for-each<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.11/31


Werken met iteratoren<br />

In elke collectie: bewerk<strong>in</strong>g iterator<br />

geeft object van klasse Iterator terug<br />

Interface Iterator: <strong>de</strong>f<strong>in</strong>ieert bewerk<strong>in</strong>gen<br />

hasNext: nog ver<strong>de</strong>re elementen?<br />

next: geeft volgen<strong>de</strong> element<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.12/31


Voorbeeld met iteratoren<br />

Duplicaten uitschrijven<br />

void schrijfDuplicaten ( Set dup ) {<br />

}<br />

Iterator it = dup . iterator ( ) ;<br />

while ( it . hasNext ( ) )<br />

System . out . pr<strong>in</strong>tln ( it . next ( ) ) ;<br />

Met gebruik van wildcards<br />

void schrijfCollectie ( Collection col ) {<br />

Iterator it = col . iterator ( ) ;<br />

while ( it . hasNext ( ) )<br />

System . out . pr<strong>in</strong>tln ( it . next ( ) ) ;<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.13/31


Gebruik van <strong>de</strong> for-each-loop<br />

Voorbeeld: duplicaten uitschrijven<br />

void schrijfDuplicaten ( Set dup ) {<br />

}<br />

for ( Str<strong>in</strong>g s : dup )<br />

System . out . pr<strong>in</strong>tln ( s ) ;<br />

Met gebruik van wildcards<br />

void schrijfCollectie ( Collection col ) {<br />

}<br />

for ( o : col )<br />

System . out . pr<strong>in</strong>tln ( o ) ;<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.14/31


Het ADT SortedSet<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.15/31


Het ADT SortedSet<br />

Interface SortedSet: extensie van Set<br />

elementen <strong>in</strong> ‘stijgen<strong>de</strong>’ volgor<strong>de</strong> bijhou<strong>de</strong>n<br />

elementen van type Comparable<br />

iterator overloopt elementen <strong>in</strong> ‘stijgen<strong>de</strong>’<br />

volgor<strong>de</strong><br />

bijkomen<strong>de</strong> bewerk<strong>in</strong>gen: first, last, subSet,<br />

headSet, tailSet<br />

Implementatie <strong>in</strong> <strong>API</strong><br />

TreeSet: via b<strong>in</strong>aire zoekboom (zie later)<br />

basisbewerk<strong>in</strong>gen <strong>in</strong> Θ(log n)<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.16/31


Voorbeeld: werken met SortedSet<br />

Priemzeef van Eratosthenes<br />

SortedSet priemzeef ( <strong>in</strong>t n ) {<br />

SortedSet x = new TreeSet ( ) ;<br />

for ( <strong>in</strong>t i = 2; i


Het ADT List<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.18/31


Het ADT List<br />

ADT List: voorstell<strong>in</strong>g van ‘sequentie’<br />

positie van elementen is belangrijk<br />

‘i-<strong>de</strong> element’, ‘volgen<strong>de</strong> element’<br />

dubbels zijn mogelijk<br />

Interface List<br />

<strong>de</strong>f<strong>in</strong>ieert ADT List<br />

Implementaties <strong>in</strong> <strong>API</strong><br />

ArrayList: m.b.v. array<br />

L<strong>in</strong>kedList: m.b.v. geschakel<strong>de</strong> lijsten<br />

(zie later) Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.19/31


Bewerk<strong>in</strong>gen <strong>in</strong> ADT List<br />

Extensie van Collection, o.a.<br />

conta<strong>in</strong>s, add, remove, size, iterator<br />

Positionele toegang: op <strong>in</strong><strong>de</strong>x<br />

get, set, add, remove<br />

Zoeken van element<br />

<strong>in</strong><strong>de</strong>xOf, lastIn<strong>de</strong>xOf<br />

Lijstiterator<br />

listIterator: voor- en achterwaarts doorlopen<br />

van lijst<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.20/31


Voorbeeld: werken met List<br />

Lijst aanmaken en opvullen met str<strong>in</strong>gs<br />

List lst = new ArrayList ( ) ;<br />

Str<strong>in</strong>g s = leesStr<strong>in</strong>g ( ) ;<br />

while ( ! s . equalsIgnoreCase ( "stop" ) ) {<br />

}<br />

lst . add ( s ) ;<br />

s = leesStr<strong>in</strong>g ( ) ;<br />

Opmerk<strong>in</strong>g<br />

add voegt elementen achteraan toe<br />

(‘append’)<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.21/31


Voorbeeld: gebruik van get en set<br />

Element op positie 3 naar hoofdletters<br />

if ( lst . size () >=4) {<br />

}<br />

Str<strong>in</strong>g s = lst . get ( 3 ) ;<br />

lst . set ( 3 , s . toUpperCase ( ) ) ;<br />

Equivalent <strong>in</strong> array (Str<strong>in</strong>g[] a)<br />

if ( a . length>=4) {<br />

}<br />

Str<strong>in</strong>g s = a [ 3 ] ;<br />

a [ 3 ] = s . toUpperCase ( ) ;<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.22/31


Voorbeeld: gebruik van <strong>in</strong><strong>de</strong>xOf<br />

Element vervangen door iets an<strong>de</strong>rs<br />

<strong>in</strong>t pos = lst . <strong>in</strong><strong>de</strong>xOf ( "appel" ) ;<br />

lst . set ( pos , "jonagold" ) ;<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.23/31


Het ADT Map<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.24/31


Het ADT Map<br />

ADT Map of ‘dictionary’<br />

object dat sleutels (‘keys’) op waar<strong>de</strong>n<br />

(‘values’) afbeeldt<br />

geen duplicaten van sleutels toegelaten<br />

Entry: sleutel/waar<strong>de</strong>-paar<br />

Voorbeel<strong>de</strong>n<br />

woor<strong>de</strong>nboek: woord op betekenis<br />

vertaallijsten: bv. Frans op Engels woord<br />

telefoonboek: naam op telefoonnummer<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.25/31


Interface Map<br />

Basisbewerk<strong>in</strong>gen<br />

put, get, remove (op sleutel)<br />

conta<strong>in</strong>sKey, conta<strong>in</strong>sValue<br />

Collection-views<br />

keySet, values, entrySet<br />

Implementaties <strong>in</strong> <strong>API</strong><br />

HashMap en TreeMap<br />

Voorbeeld: opbouwen van frequentietabel<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.26/31


Voorbeeld: werken met Map<br />

Opbouwen frequentietabel<br />

Map bepaalFreq ( Str<strong>in</strong>g [ ] rij ) {<br />

}<br />

Map freq<br />

= new HashMap ( ) ;<br />

for ( <strong>in</strong>t i = 0; i < rij . length ; i++)<br />

if ( freq . conta<strong>in</strong>sKey ( rij [ i ] ) )<br />

else<br />

freq . put ( rij [ i ] , freq . get ( rij [ i ] ) + 1 ) ;<br />

freq . put ( rij [ i ] , EEN ) ;<br />

return freq ;<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.27/31


Het ADT SortedMap<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.28/31


Het ADT SortedMap<br />

Interface SortedMap: extensie van Map<br />

entries bijhou<strong>de</strong>n <strong>in</strong> stijgen<strong>de</strong> volgor<strong>de</strong><br />

sleutels moeten van type Comparable zijn<br />

bijkomen<strong>de</strong> bewerk<strong>in</strong>gen<br />

first, last, subMap, headMap, tailMap<br />

Implementatie <strong>in</strong> <strong>API</strong><br />

TreeMap: via b<strong>in</strong>aire zoekboom<br />

Voorbeeld: een <strong>in</strong><strong>de</strong>x opbouwen<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.29/31


Voorbeeld: werken met Map<br />

Een <strong>in</strong><strong>de</strong>x opbouwen<br />

SortedMap<br />

bouwIn<strong>de</strong>x ( ArrayList lijnen ) {<br />

SortedMap <strong>in</strong><strong>de</strong>x<br />

= new TreeMap ( ) ;<br />

<strong>in</strong>t lijnnummer = 0;<br />

for ( Str<strong>in</strong>g lijn : lijnen ) {<br />

lijnnummer++;<br />

Scanner woor<strong>de</strong>n = new Scanner ( lijn ) ;<br />

while ( woor<strong>de</strong>n . hasNext ( ) ) {<br />

Str<strong>in</strong>g woord = woor<strong>de</strong>n . next ( ) ;<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.30/31


(vervolg)<br />

}<br />

} }<br />

if ( <strong>in</strong><strong>de</strong>x . conta<strong>in</strong>sKey ( woord ) ) {<br />

List lijst = <strong>in</strong><strong>de</strong>x . get ( woord ) ;<br />

lijst . add ( new Integer ( lijnnummer ) ) ;<br />

} else {<br />

}<br />

List lijst<br />

= new ArrayList ( ) ;<br />

lijst . add ( new Integer ( lijnnummer ) ) ;<br />

<strong>in</strong><strong>de</strong>x . put ( woord , lijst ) ;<br />

return <strong>in</strong><strong>de</strong>x ;<br />

Cursus Algoritmen en <strong>Datastructuren</strong> voor Geomatica (2008–2009) – p.31/31

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!