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