Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

PlantUML Macro
class EverySecondIterator {
	EverySecondIterator(Iterator<Object>)
	boolean hasNext()
	Object next()
}
interface "Iterator<Object>" as iterator {
}
iterator <|-- EverySecondIterator
EverySecondIterator --> iterator: iteratorDelegate
Code Block
languagejava
public class EverySecondIterator implements Iterator<Object> {
	
	private Iterator<Object> iteratorDelegate;
    
    public EverySecondIterator(Iterator<Object> iterator) {
        this.iteratorDelegate = iterator;
    }
    
    @Override
    public boolean hasNext() {
        return iteratorDelegate.hasNext();
    }

	@Override
    public Object next() {
        Object o = iteratorDelegate.next();
        if (iteratorDelegate.hasNext()) {
            iteratorDelegate.next();
        }
        return o;
    }
}

Vi ser at hvert kall til hasNext() vil resultere i et kall til hasNext()delegaten (iteratorDelegate). Hvert kall vil next() vil imidlertid gi først et kall til next()delgaten og så et kall til hasNext() og evt. et nytt kall til next(). Effekten av det andre kallet til next() er å bruke opp / hoppe over annenhvert element: det første elementet brukes, det andre kastes, det tredje brukes og det fjerde kastes osv. hasNext()-kallet er der for å unngå å utløse unntak ved at vi hopper over et element som ikke finnes.

Et viktig poeng her, ut over bruken av delegering, er at konstruktøren tar inn delegaten, slik at den som bruker EverySecondIterator, kan bestemme hvilken iterator det delegeres til, dvs. hvor elementene egentlig kommer fra. I følgende kode-eksempel kommer elementene fra en vanlig liste:

Code Block
languagejava
List<Object> list = new ArrayList<Object>(Arrays.asList(1, 2, 3, 4, 5, 6));
// produces every second element in list
Iterator<Object> it2 = new EverySecondIterator(list.iterator());
// prints 1 3 5
 while (it2.hasNext()) {
	System.out.print(it2.next() + " ");
}

En EverySecondIterator-instans kan delegere til en annen EverySecondIterator, for dermed å hoppe over flere elementer:

Code Block
languagejava
List<Object> list = new ArrayList<Object>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
// produces every fourth element in list
Iterator<Object> it2 =
	new EverySecondIterator(new EverySecondIterator(list.iterator()));
// prints 1 5 9
while (it2.hasNext()) {
	System.out.println(it2.next() + " ");
}
PlantUML Macro
Hovedprogram --> EverySecondIterator: hasNext()
EverySecondIterator --> "iteratorDelegate: Iterator<Object>": hasNext()
Hovedprogram --> EverySecondIterator: next()
EverySecondIterator --> "iteratorDelegate: Iterator<Object>": next()
EverySecondIterator --> "iteratorDelegate: Iterator<Object>": hasNext()
EverySecondIterator --> "iteratorDelegate: Iterator<Object>": next()

...