11Adatszerkezetek
Download
Report
Transcript 11Adatszerkezetek
20. Klasszikus adatszerkezetek
21. Kollekció keretrendszer
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 1
20. Klasszikus adatszerkezetek
1.
2.
3.
4.
5.
6.
7.
8.
Az adatszerkezetek rendszerezése
Absztrakt tárolók
Tömb
Tábla
Verem
Sor
Fa
Irányított gráf, hálózat
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 2
Adatszerkezetek
Adatmodell, eljárásmodell
Adatszerkezet: egymással kapcsolatban álló adatok,
objektumok összessége
Elemei: csomóponti adatok, kapcsolatok
Reprezentáció: gráffal
• csomóponti adatok: gráf csúcsai
• kapcsolatok: gráf élei
Műveletek
• Konstrukciós műveletek
• Szelekciós műveletek
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 3
Példa: Hallgató objektumok összekapcsolása
Boldog
Boglárka
Madár
Aladár
Fekete
Farkas
Madár
Aladár
Boldog
Boglárka
Fekete
Farkas
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 4
Adatszerkezetek rendszerezése az
elemek közötti kapcsolatok alapján
ADATSZERKEZETEK
Asszociatív
Tömb
Tábla
Szekvenciális
Verem
Gábor Dénes Főiskola (IAI)
Sor
Hierarchikus
Fa
Hálós
Ir. gráf Hálózat
Programozási technológia (Java) - V. / 5
Asszociatív adatszerkezet
Asszociatív
csoport
Szekvenciális adatszerkezet
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 6
Hierachikus adatszerkezet
Hálós adatszerkezet
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 7
Absztrakt tárolók
Címezhető tárolókon absztrakt tárolási lehetőségek:
• Egydimenziós tömb
• Láncolt lista
Absztrakt tároló helye: bármilyen címezhető hardver
elem (pl. memória, lemezes egység)
Az adatszerkezetek leképezhetők absztrakt tárolókra
Egydimenziós tömb
A tárolt objektumok közvetlenül egymás után helyezkednek el, ugyanolyan távolságra egymástól
Elemei indexeléssel közvetlenül címezhetők
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 8
Láncolt lista
Elemei mutatókon keresztül össze vannak kapcsolva
A listát az első listaelem mutatója (L) meghatározza
Egy listaelem: adat + mutató
1
2
3
n
...
L
Adat
Mutató
Végjel
Egyirányú nyíltvégű láncolt lista
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 9
Láncolt lista (folyt.)
Elemei fizikailag bárhol elhelyezkedhetnek
Előnye: beszúrás, törlés egyszerű
Változatai:
• Nyíltvégű lista
• Cirkuláris (zárt) lista
• Rendezett lista
• Kétirányú (szimmetrikus) lista
• Fejelt lista
• Multilista (többszörös lista)
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 10
Tömb
Asszociatív adatszerkezet
Fajtái:
• Általános tömb
• Ritka mátrix
Általános tömb
Elemei indexeléssel közvetlenül elérhetők
Hátrányai
• méretét előre meg kell adni
• indexhatárok dimenziónként kötöttek
Tárolás: egydimenziós tömbben
(az adatszerkezet általában maga a tároló)
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 11
Ritka mátrix
Olyan többdimenziós tömb, ahol a tömb nagy része
kihasználatlan
Tárolás: láncolt listában
1
2
3
4
5
1
0
0
0
0
0
2
0
21
0
0
0
Gábor Dénes Főiskola (IAI)
3
0
0
0
99
0
4
0
0
0
0
0
5
0
0
0
0
0
6
3
0
0
0
0
7
0
0
0
0
0
8
0
0
0
7
0
9
0
0
0
0
0
Programozási technológia (Java) - V. / 12
Tábla
Asszociatív adatszerkezet
Egy elem: egyedi kulcs + adat
Tárolás: egydimenziós tömbben vagy láncolt listában
adat
adat
adat
adat
adat
adat
adat
kulcs
kulcs
kulcs
kulcs
kulcs
kulcs
kulcs
Kérem azt az adatot,
melynek kulcsa ...
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 13
Táblák osztályzása (tárolási mód alapján)
Soros tábla
Önátrendező tábla
Rendezett tábla
Hasító (kulcstranszformációs) tábla
Hasítótábla (hash table)
Hasítófüggvény (kulcstranszformációs függvény):
kulcs elem fizikai címe
Hasonlítgatások száma minimális
Legjobb táblaszervezési mód: egyértelmű leképezés a
kulcsok és a fizikai címek között
Szinonímák
• azonos címre leképezett kulcsok
• megvalósítás: láncolt listával
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 14
Hasítótábla egyértelmű leképezéssel
Hasítófüggvény
Kulcs
1.
2.
3.
...
m.
Kulcs
Kulcs
Kulcs
...
Kulcs
Adat
Adat
Adat
...
Adat
Hasítótábla szinonímákkal
Hasító(Kulcs) 1.
2.
Kulcs
3.
...
m.
Gábor Dénes Főiskola (IAI)
Első
Első
Első
...
Első
Kulcs+Adat
Kulcs+Adat
Kulcs+Adat
Kulcs+Adat
Kulcs+Adat
Programozási technológia (Java) - V. / 15
Verem (stack)
Szekvenciális adatszerkezet
LIFO (Last In First Out) szerkezet
Műveletei: PUSH, POP, TOP
PUSH
POP
Legfiatalabb
Legidősebb
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 16
Verem (folyt.)
Tárolás: általában egydimenziós tömbben
Alkalmazásai:
• Elemek sorrendjének megfordítása
• Visszatérési utak megjegyzése
• Memóriaverem: metódusok hívásakor a
visszatérési címek és lokális változók tárolása
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 17
Sor (queue)
Szekvenciális adatszerkezet
FIFO (First In First Out) adatszerkezet
Műveletei: PUT, GET, FIRST
GET
...
Első
Legidősebb
Gábor Dénes Főiskola (IAI)
PUT
Utolsó
Legfiatalabb
Programozási technológia (Java) - V. / 18
Sor (folyt.)
Tárolás: egydimenziós tömbben vagy láncolt listában
Ciklikus tárolás egydimenziós tömbben:
1.
2.
3.
4.
5.
...
—
34
66
2
999
7
Első
Max
—
—
Utolsó
Alkalmazása: elemek feldolgozása érkezési sorrendben
Például: pufferek (billentyűzetpuffer, nyomtatópuffer)
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 19
Fa
Hierarchikus adatszerkezet
Elemei: csomópontok és egyirányú kapcsolatok
Rekurzív definíció, rekurzív algoritmusok
0. szint
1. szint
Levél (0 fokú)
3. szint
Gábor Dénes Főiskola (IAI)
Gyökér
a
b
Elágazás (3 fokú)
c
Részfa
d
e
f
g
Programozási technológia (Java) - V. / 20
Fával kapcsolatos fogalmak
Kezdőpont, végpont
Gyökér, elágazás, levél
Csomópont foka, fa foka
a
b
c
Szülő, gyerek
Szintszám
Fa magassága
d
e
f
g
Rendezett fa
Kiegyensúlyozott fa
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 21
Fa bejárása
Gyökérkezdő (preorder)
a
a b c d g e f
Gyökérvégző (postorder)
b
c a
b
d e f c a
b g d e f c a
Gábor Dénes Főiskola (IAI)
b
c
d
e
f
g
Programozási technológia (Java) - V. / 22
Bináris fa
Gyökeréből legfeljebb két részfa ágazik:
baloldali és jobboldali részfa
Bejárása
Gyökérkezdő (preorder)
a b d c e g h i j f
Gyökérközepű (inorder)
d b a g e i h j c f
Gyökérvégző (postorder)
d b g i j h e f c a
Gábor Dénes Főiskola (IAI)
a
c
b
d
f
e
g
h
i
j
Programozási technológia (Java) - V. / 23
Rendezett bináris fa
8
4
2
1
12
6
3
5
10
7
9
11
14
13
15
Keresési fa (kereső fa, rendező fa)
A baloldali részfa összes eleme kisebb, mint a szülő
A jobboldali részfa összes eleme nagyobb, mint a szülő
Egy n szintű fa elemeinek száma maximum 2n+1-1
Egy elemet maximum n+1 lépésben megtalálunk
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 24
Kiegyensúlyozott bináris fa
8
4
12
2
1
6
3
5
10
7
9
11
14
13
15
Elemek beszúrási sorrendje:
8, 4, 12, 10, 9, 14, 2, 3, 6, 1, 15, 5, 7, 13, 11
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 25
Degenerált bináris fa
1
2
3
4
5
6
7
8
9
10
Elemek beszúrási sorrendje:
1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15
Gábor Dénes Főiskola (IAI)
11
12
13
14
15
Programozási technológia (Java) - V. / 26
Fa tárolása multilistában
a
b
c
d
g
e
f
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 27
Hálós adatszerkezetek
Irányított gráf
e
d
a
c
b
Hálózat
4
d
1
a
2
Gábor Dénes Főiskola (IAI)
2
c
7
9
b
Programozási technológia (Java) - V. / 28
21. Kollekció keretrendszer
1.
2.
3.
4.
5.
6.
7.
8.
9.
A kollekció keretrendszer felépítése
A Collection interfész és leszármazottai
A HashSet osztály – hasítási technika
A TreeSet osztály – Comparator
Iterátor
A List interfész implementációi
A Map és a SortedMap interfész
A Hashtable osztály
A TreeMap osztály
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 29
Kollekció keretrendszer (Collections Framework)
Interfészeket és osztályokat definiál különböző
konténerek hatékony létrehozása céljából
Elemei:
• Interfészek
• kollekció
• térkép
• iterátor
• Implementációk (osztályok)
• Algoritmusok (Collections osztály)
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 30
Kollekció
keretrendszer
«interfész»
Collection
Osztályok
Interfészek
ArrayList
HashSet
TreeSet
Hashtable
«interfész»
Set
«interfész»
List
Stack
LinkedList
«interfész»
SortedSet
Algoritmusok
HashMap
«interfész»
Map
«interfész»
Iterator
TreeMap
«interfész»
SortedMap
«interfész»
ListIterator
Gábor Dénes Főiskola (IAI)
Vector
Collections
Programozási technológia (Java) - V. / 31
A Collection interfész és leszármazottai
«interfész»
Collection
ArrayList
HashSet
«interfész»
Set
«interfész»
List
Vector
Stack
LinkedList
TreeSet
«interfész»
SortedSet
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 32
Collection interfész (kollekció)
Objektumokat tárol
«interfész»
Collection
size(): int
Van legalább két konstruktora: isEmpty(): boolean
contains(elem: Object): boolean
• paraméter nélküli
containsAll(c: Collection): boolean
• kollekcióval paraméterezett
add(elem: Object): boolean
Nincs példányosítható
addAll(c: Collection): boolean
remove(elem: Object): boolean
implementációja a
removeAll(c: Collection): boolean
keretrendszerben
retainAll(c: Collection): boolean
Bejárás iterátorral
clear()
equals(o: Object): boolean
toArray():Object[]
toArray(Object a[]):Object[]
iterator(): Iterator
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 33
Set interfész (halmaz)
Elemei
• egyediek
• nem rendezettek
Implementációja:
HashSet
SortedSet interfész
(rendezett halmaz)
Elemei
• egyediek
• rendezettek
Implementációja:
TreeSet
Gábor Dénes Főiskola (IAI)
«interfész»
Set
«interfész»
SortedSet
first(): Object
last(): Object
comparator(): Comparator
headSet(toElement: Object): SortedSet
tailSet(fromElement: Object): SortedSet
subSet(fromElement: Object,
toElement: Object): SortedSet
Programozási technológia (Java) - V. / 34
List interfész (lista)
Elemei
• nem egyediek
«interfész»
List
get(index: int): Object
set(index: int, elem: Object): Object
• egy meghatározott
sorrendben követik
add(index: int, elem: Object)
egymást
• indexelhetők
Implementációi:
ArrayList,
Vector,
LinkedList,
Stack
Gábor Dénes Főiskola (IAI)
addAll(index: int, c: Collection): boolean
remove(index: int): Object
indexOf(o: Object): int
lastIndexOf(o: Object): int
listIterator():ListIterator
listIterator(index: int): ListIterator
Programozási technológia (Java) - V. / 35
A HashSet osztály – hasítási technika
n
e o
H
0
1
2
Csoportindex
...
t
a
6
7
...
9
"Hottentotta" karaktereinek hasítása
Character kar = new Character('H');
kar.hashCode() == 72
csoportindex == kar.hashCode()%10 == 2
Kapacitás: 10
Elemszám: 6
Telítettség: 0.6
Telítettségi küszöb: 0.9
Hasítókód (hashCode, hasítófüggvény)
Kapacitás: hasítással előállított csoportok száma
Hasítókód normalizálása:
csoportindex = obj.hashCode() % kapacitás
Telítettség: elemszám / kapacitás
Telítettségi küszöb
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 36
Hasítófüggvény készítésének szabályai
Egy objektumnak mindig ugyanazt a hasítókódot kell
generálnia
o1.equals(o2) hashCode(o1)==hashCode(o2)
Egyenletes eloszlásra törekvés
Hashset-be beteendő objektumok osztályában
(szükség esetén) átírandó metódusok:
• hashCode
• equals
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 37
HashSet osztály
Halmaz (Set interfész implementációja)
Megvalósítás: hasítási technikával (hasítótáblával)
Gyors műveletek, megjósolhatatlan bejárás
Alkalmazás
• Egyedi, rendezetlen elemeket tartalmazó kollekció
• Nagy elemszám esetén nagyon hatékony!
Konstruktorok, metódusok
• HashSet()
HashSet(int initialCapacity)
HashSet(int initialCapacity, float loadFactor)
HashSet(Collection c)
• String toString() [elem,elem,...]
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 38
Feladat – HashSetBetuk
Kérjünk be konzolról egy karakterláncot! Írjuk ki a benne
szereplő betűket ábécérendben (mindegyiket csak egyszer)!
Együttműködési diagram
szoveg:String
charAt()
HashSetBetuk
add()
contains()?
Gábor Dénes Főiskola (IAI)
betuk:
HashSet
:Character
:Character
:Character
Programozási technológia (Java) - V. / 39
…
public class HashSetBetuk {
public static void main(String[] args) {
HashSet betuk = new HashSet();
String szoveg = Console.readLine("Szöveg= ");
for (int i=0; i<szoveg.length(); i++)
betuk.add(new Character(szoveg.charAt(i)));
System.out.println(betuk);
for (char c=0; c<Character.MAX_VALUE; c++)
if (betuk.contains(new Character(c)))
System.out.print(c);
System.out.println();
}
}
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 40
Feladat – HashTorpe
Az emberre jellemző a neve és a magassága: e két
adattal inicializáljuk őket. Tartsunk nyilván embereket, de
két ugyanolyan nevű ember nem szerepelhet a nyilvántartásban!
Vegyük nyilvántartásba a hét törpét! Végül listázzuk ki a
felvitt emberek adatait (név, magasság) egymás után!
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 41
A 26 felé hasított hét törpe
...
...
H
...
K
...
...
M
S
T
...
V
Morgó
Szende
Hapci
Kuka
Tudor
Szundi
Vidor
112
104
122
126
126
146
128
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 42
…
class Ember {
private String nev;
private int magassag;
public Ember(String nev, int magassag) {
this.nev = nev;
this.magassag = magassag;
}
public String getNev() { return nev; }
public int getMagassag() { return magassag; }
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 43
public int hashCode() {
if (nev.length() == 0)
return 0;
return Character.toUpperCase(nev.charAt(0));
}
public boolean equals(Object obj) {
if ((obj != null) && (obj instanceof Ember))
return nev.equals(((Ember)obj).getNev());
return false;
}
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 44
public String toString() {
return Format.left(nev,10) + Format.right(magassag,3);
}
} // Ember
public class HashTorpe {
public static void main(String[] args) {
HashSet torpek = new HashSet(26);
torpek.add(new Ember("Morgó",112));
torpek.add(new Ember("Szende",104));
torpek.add(new Ember("Hapci",122));
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 45
torpek.add(new Ember("Kuka",126));
torpek.add(new Ember("Tudor",126));
torpek.add(new Ember("Szundi",146));
torpek.add(new Ember("Vidor",128));
torpek.add(new Ember("Hapci",100)); // Hatástalan
torpek.add(new Ember("Tudor",128)); // Hatástalan
System.out.println("Törpék száma: "+torpek.size());
System.out.println(torpek);
}
} // HashTorpe
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 46
A TreeSet osztály - Comparator
Rendezett halmaz (SortedSet interfész impl.)
Megvalósítás: kiegyensúlyozott fával
Halmazba tett objektumok összehasonlíthatóak
Két eset:
• Osztályuk implementálja a Comparable interfészt
(természetes össszehasonlítás)
• TreeSet konstruktorában megadunk egy
összehasonlító (comparator) objektumot
Alkalmazás
• Egyedi, rendezett elemeket tartalmazó kollekció
• Nagy elemszámnál a keresés nagyon hatékony!
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 47
Konstruktorok, metódusok
• TreeSet()
• TreeSet(Collection c)
TreeSet(SortedSet s)
• TreeSet(Comparator comp)
• Comparator comparator()
Comparator interfész
Céljai:
• más rendezettség megadása
(a természetes rendezettségen túl)
• rendezettség megadása kívülről
Implementációjának példánya egy összehasonlító
objektum, mely átadható a TreeSet konstruktorának
Metódusa
• public int compare(Object a, Object b)
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 48
Feladat – TreeSetNevek
Tegyünk be keresztneveket egy konténerbe! Ne vigyünk
be egyforma neveket! Írjuk ki a neveket először névsor
szerint, azután névhosszúság szerinti rendezettségben!
import java.util.*;
public class TreeSetNevek {
public static void main(String[] args) {
TreeSet nevsor = new TreeSet();
nevsor.add("Soma");
nevsor.add("Jeremiás");
nevsor.add("Janka");
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 49
// Kiírás névsorban:
System.out.println(nevsor);
TreeSet nevek = new TreeSet(new Comparator() {
public int compare(Object a, Object b) {
return ((String)a).length() - ((String)b).length();
}
} );
nevek.addAll(nevsor);
System.out.println(nevek);
}
}
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 50
Iterátor
Iterátor: objektum, mellyel egy kollekció bejárható
Egy kollekcióhoz több iterátor is kapcsolható
Az iterátor objektum felelős a kollekció helyes bejárásáért
Egy kollekció egy iterátorral csak egyszer járható be
Iterátor elkérése a coll kollekciótól:
Iterator iter = coll.iterator();
Az iterátornak implementálnia kell az Iterator interfészt
Iterator interfész
• boolean hasNext()
• Object next()
• void remove()
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 51
Példa: tetszőleges kollekció bejárása iterátorral
c:HashSet
iter
iterator()
Collection c = new ...;
...
hasNext()
next()
remove()
Iterator iter = c.iterator();
while (iter.hasNext()) {
Object current = iter.next();
// (Objektum osztálya)current.üzenet;
}
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 52
Feladat – Országok
Tegyünk be országokat egy HashSet kollekcióba!
Listázzuk ki őket először a HashSet-be beépített módon,
majd egy iterátorobjektum segítségével!
import java.util.*;
public class Orszagok {
public static void main(String[] args) {
String[] nevek = { "USA","Lengyelország","Nepál",
"Magyarország","Kuba"};
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 53
HashSet orszagok = new HashSet();
for (int i = 0; i < nevek.length; i++)
orszagok.add(nevek[i]);
System.out.println(orszagok);
System.out.println("Országok:");
Iterator iter = orszagok.iterator();
while (iter.hasNext())
System.out.println(iter.next());
}
}
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 54
A List interfész implementációi
«interfész»
Iterator
ArrayList
«interfész»
List
Vector
LinkedList
Gábor Dénes Főiskola (IAI)
Stack
«interfész»
ListIterator
Programozási technológia (Java) - V. / 55
ArrayList
Megvalósítás: újraméretezhető tömbbel
Vector
Megvalósítás: újraméretezhető tömbbel
Metódusai szinkronizáltak
LinkedList
Megvalósítás: kétirányú láncolt listával
Stack
Speciális vektor
Verem adatszerkezetet valósítja meg
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 56
ListIterator interfész
Iterator interfész leszármazottja
Segítségével a kollekció mindkét irányban bejárható
Listaiterátor elkérése a lista listától:
ListIterator iter = lista.listIterator();
Metódusok
• boolean hasNext()
boolean hasPrevious()
• Object next()
int nextIndex()
• Object previous()
int previousIndex()
• void add(Object obj)
void remove()
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 57
Feladat – LinkedListTest
Vigyünk fel szövegeket egy láncolt listába! Ezután
listázzuk ki a szövegeket
a felvitel sorrendjében!
visszafelé, s közben töröljük ki az A betűvel kezdődő
szövegeket!
s megint elölről!
Végül írjuk ki az utolsó szöveget!
public class LinkedListTest {
public static void main(String[] args) {
LinkedList lista = new LinkedList();
lista.add("Gergő");
lista.add("Anna");
lista.add("Matyi");
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 58
System.out.println("Listázás előre:");
ListIterator iter = lista.listIterator();
while (iter.hasNext())
System.out.println(iter.next());
System.out.println("\nListázás visszafelé, közben az "+
"A betűsök törlése:");
while (iter.hasPrevious()) {
String str = (String)iter.previous();
System.out.println(str);
if (str.startsWith("A"))
iter.remove();
}
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 59
System.out.println("\nListázás előre: ");
iter = lista.listIterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
System.out.println("\nUtolsó elem: " +
lista.get(lista.size()-1));
} // main
}
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 60
«interfész»
Map
size(): int
isEmpty(): boolean
remove(key: Object)
clear()
get(key: Object): Object
put(key: Object, value: Object): Object
putAll(entries: Map)
containsKey(key: Object): boolean
containsValue(value: Object): boolean
keySet(): Set
values(): Collection
«interfész»
SortedMap
comparator():Comparator
firstKey(): Object
lastKey(): Object
Gábor Dénes Főiskola (IAI)
A Map és a
SortedMap interfész
Térkép
Kulcs-érték párokat tárol
Hashtable
HashMap
TreeMap
Programozási technológia (Java) - V. / 61
A Hashtable osztály
Map interfész implementációja
Rendezetlen térkép, mely kulcs-érték párokat tárol
Megvalósítás: hasítási technikával (hasítótáblával)
Konstruktorok
• Hashtable()
• Hashtable(Map entries)
• Hashtable(int initialCapacity)
• Hashtable(int initialCapacity, float loadFactor)
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 62
Feladat – HashtableAuto
Vigyünk fel autók adatait! A rendszámot és a hozzá
tartozó autómárkát egy-egy szövegben tároljuk. A
rendszám egyedi adat. Ezután
Írjuk ki az autók adatait a Hashtable.toString által
felkínált formában!
Írjuk ki külön a kulcsokat, majd külön az értékeket
(autómárkákat)!
Keressük meg a megadott rendszámú autót! Írjuk ki
az autó márkáját.
Cseréljünk ki egy megadott rendszámú autó márkáját!
Írjuk ki egyenként, sorszámozva az autók adatait!
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 63
import java.util.*;
public class HashtableAuto {
public static void main(String[] args) {
Hashtable autok = new Hashtable();
autok.put("BIT-442", "Piros Romeo");
autok.put("SIT-999", "Fehér Merci");
autok.put("CAR-152", "Zöld Mazda");
// A tejles térkép összes bejegyzésének kiírása:
System.out.println(autok);
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 64
// Kulcsok, értékek kiírása:
System.out.println("Kulcsok: "+autok.keySet());
System.out.println("Értékek: "+autok.values());
// Adott kulcsú bejegyzés keresése:
String rendszam = "CAR-152";
if (autok.containsKey(rendszam))
System.out.println(rendszam+" megvan, "+
autok.get(rendszam));
// Csere:
autok.put(rendszam, "Fekete Trabant");
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 65
// Kiírás iterátorral:
Iterator iter = autok.keySet().iterator();
int n = 0;
while (iter.hasNext()) {
Object key = iter.next();
System.out.println(++n + ". " + autok.get(key));
}
}
}
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 66
A TreeMap osztály
SortedMap interfész implementációja
Rendezett kulcsokat tartalmazó térkép
Megvalósítás: kiegyensúlyozott fával
(a kulcsok összehasonlíthatók)
Konstruktorok
• TreeMap()
TreeMap(Comparator c)
• TreeMap(Map m)
TreeMap(SortedMap m)
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 67
Feladat – TreeMapUser
Egy internetszolgáltató tárolni akarja a felhasználók
adatait: a felhasználó nevét, jelszavát és a legutóbbi
látogatásának időpontját. A használati esetek a
következők:
Új felhasználó felvitele
Felhasználók számának kiírása
Felhasználónevek listázása ábécé szerint
A jelszó és a legutóbbi látogatás kiírása a
felhasználónév alapján
A használati eseteket hajtsuk végre egymás után!
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 68
import java.util.*;
import java.text.DateFormat;
class User {
private String userName; // felhasználónév
private String password; // jelszó
private Date lastVisited; // a legutóbbi belépés időpontja
public User(String userName, String password) {
this.userName = userName;
this.password = password;
this.lastVisited = new Date(); // mai dátum
}
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 69
public User(String userName) {
this(userName,"");
}
public String getUserName() { return userName; }
public String getPassword() { return password; }
public String getLastVisited() {
return DateFormat.getDateTimeInstance().
format(lastVisited);
}
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 70
public void setLastVisited() {
lastVisited = new Date();
}
public String toString() {
return userName+", "+password+", "+getLastVisited();
}
} // class User
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 71
public class TreeMapUser {
public static void main(String[] args) {
TreeMap users = new TreeMap();
users.put("Nagybuta",
new User("NagyButa", "netuddmeg"));
users.put("Bendegúz",
new User("Bendegúz", "anyukád"));
users.put("Erzsébet",
new User("Erzsébet", "kimást"));
users.put("Naspolya",
new User("Naspolya", "eddmeg"));
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 72
System.out.println("Felhasználók száma: " +users.size());
// Felhasználónevek listázása:
System.out.println("\nFelhasználónevek:");
Iterator iter = users.keySet().iterator();
while (iter.hasNext())
System.out.println(iter.next());
// Felhasználók adatai:
System.out.println("\nFelhasználók adatai:");
Collection values = users.values();
iter = values.iterator();
while (iter.hasNext())
System.out.println(iter.next());
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 73
// Megadott felhasználó jelszavának kiírása:
String userName = "Bendegúz";
User user = (User)users.get(userName);
if (user == null)
System.out.println("\nNincs " + userName);
else {
System.out.println("\n" + userName +
" jelszava: " + user.getPassword() +
", legutóbbi látogatása: " + user.getLastVisited());
}
}
}
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - V. / 74