Datastructuren in de Java API - caagt
Datastructuren in de Java API - caagt
Datastructuren in de Java API - caagt
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