A Lista osztály Elem segédosztályát
el akarjuk rejteni a külvilág elől.
public class Lista {
private Elem elso;
private static class Elem {
Object adat;
Elem elozo, kovetkezo;
Elem (Object adat, Elem elozo, Elem kovetkezo) {
this.adat = adat;
this.elozo = elozo;
this.kovetkezo = kovetkezo;
}
}
public void beszur (Object adat) {
elso = new Elem(adat,null,elso);
if (elso.kovetkezo != null)
elso.kovetkezo.elozo = elso;
}
public void torol (Object adat) {
Elem elem = keres(adat);
if (elem != null)
torol(elem);
}
private void torol (Elem elem) {
if (elem == elso)
elso = elem.kovetkezo;
if (elem.elozo != null)
elem.elozo.kovetkezo = elem.kovetkezo;
if (elem.kovetkezo != null)
elem.kovetkezo.elozo = elem.elozo;
}
private Elem keres (Object adat) {
for (Elem elem = elso; elem != null; elem = elem.kovetkezo)
if (elem.adat.equals(adat))
return elem;
return null;
}
}
A teljes program:
Lista.java
|
A Lista osztály implementációjához szükséges
Felsorolo osztálynak hozzá kell férnie a
Lista osztály privát tagjaihoz.
public class Lista {
...
private static class Felsorolo
implements Iterator {
final Lista lista;
Elem aktualis;
Elem torolheto = null;
Felsorolo (Lista lista) {
this.lista = lista;
aktualis = lista.elso;
}
public boolean hasNext () {
return aktualis != null;
}
public Object next ()
throws NoSuchElementException {
if (aktualis != null) {
torolheto = aktualis;
Object adat = aktualis.adat;
aktualis = aktualis.kovetkezo;
return adat;
}
else {
throw new NoSuchElementException();
}
}
public void remove ()
throws IllegalStateException {
if (torolheto != null) {
lista.torol(torolheto);
torolheto = null;
}
else {
throw new IllegalStateException();
}
}
}
...
public Iterator felsorol () {
return new Felsorolo(this);
}
}
A teljes program:
Lista.java
|
A Felsorolo osztály a Lista osztály
nem statikus tagosztálya, ezért minden példánya a Lista
osztály valamely példányához van rendelve.
public class Lista {
...
private class Felsorolo
implements Iterator {
Elem aktualis = elso;
Elem torolheto = null;
public boolean hasNext () {
return aktualis != null;
}
public Object next ()
throws NoSuchElementException {
if (aktualis != null) {
torolheto = aktualis;
Object adat = aktualis.adat;
aktualis = aktualis.kovetkezo;
return adat;
}
else {
throw new NoSuchElementException();
}
}
public void remove ()
throws IllegalStateException {
if (torolheto != null) {
torol(torolheto);
torolheto = null;
}
else {
throw new IllegalStateException();
}
}
}
...
public Iterator felsorol () {
return new Felsorolo();
}
}
A teljes program:
Lista.java
|
Nem statikus tagosztály kiterjesztésekor a szülő konstruktorát
el kell látni befoglaló példánnyal, ha a kiterjesztés a szülőt
befoglaló osztályon kívül történik.
public class KulsoFelsorolo extends Lista.Felsorolo {
public KulsoFelsorolo (Lista lista) {
lista.super();
// ...
}
// ...
}
A teljes program:
Lista.java,
KulsoFelsorolo.java
|
A Felsorolo osztály lokális osztályként definiálva.
public Iterator felsorol () {
class Felsorolo implements Iterator {
...
};
return new Felsorolo();
}
A teljes program:
Lista.java
|
Valamilyen objektumon végrehajtandó műveletet absztraháló interfész.
public interface Muvelet {
void vegrehajt (Object adat);
}
A teljes program:
Muvelet.java
|
Belső iterátor a Lista osztályban.
public class Lista {
...
public void mindre (Muvelet muvelet) {
for (Elem elem = elso; elem != null; elem = elem.kovetkezo)
muvelet.vegrehajt(elem.adat);
}
}
A teljes program:
Lista.java
|
A Muvelet osztály példányai túlélik a
multiplicitas metódus futását, és megjegyzik
a minta paraméter értékét.
static int multiplicitas (Lista lista, final Object minta) {
class Szamlalo implements Muvelet {
int n = 0;
public void vegrehajt (Object adat) {
if (adat.equals(minta))
n++;
}
}
Szamlalo szamlalo = new Szamlalo();
lista.mindre(szamlalo);
return szamlalo.n;
}
A teljes program:
Pelda1.java
|
A Felsorolo osztály névtelen osztályként definiálva.
public Iterator felsorol () {
return new Iterator() {
Elem aktualis = elso;
Elem torolheto = null;
public boolean hasNext () {
return aktualis != null;
}
public Object next ()
throws NoSuchElementException {
if (aktualis != null) {
torolheto = aktualis;
Object adat = aktualis.adat;
aktualis = aktualis.kovetkezo;
return adat;
}
else {
throw new NoSuchElementException();
}
}
public void remove ()
throws IllegalStateException {
if (torolheto != null) {
torol(torolheto);
torolheto = null;
}
else {
throw new IllegalStateException();
}
}
};
}
A teljes program:
Lista.java
|