// Liitetään pakkaukseen. package pino; /* * Olio-ohjelmoinnin perusteet I. * * Pinon iteraattori, joka käy pinon läpi päällimmäisestä alkiosta alimmaiseen * alkioon. * * Tyyppiparametri on sama kuin pinon alkion parametri. * * Jorma Laurikkala (jorma.laurikkala@tuni.fi). * * Viimeksi muutettu 18.2.2020. * */ // Otetaan käyttöön Iterator-rajapinta ja poikkeus. import java.util.Iterator; import java.util.NoSuchElementException; public class LinkitettyPinoIteraattori implements Iterator { // Viite iteroitavaan pinoon. private LinkitettyPino pino; // Nykyisen paikan indeksiarvo. private int nykyisenPaikanIndeksi; /* * Rakentaja, joka saa parametrinaan viitteen iteroitavaan pinoon. Heitetään * poikkeus, jos parametri on null. */ public LinkitettyPinoIteraattori(LinkitettyPino iteroitava) throws IllegalArgumentException { // Reagoidaan virheelliseen parametrin. if (iteroitava == null) { throw new IllegalArgumentException("Null-arvoinen pino!"); } // Liitetään attribuutti listaolioon. pino = iteroitava; // Aloitetaan ensimmäisestä paikasta. nykyisenPaikanIndeksi = 0; } @Override public boolean hasNext() { // Listalla on vielä käsittelemätön alkio. if (nykyisenPaikanIndeksi < pino.koko()) { return true; } // Koko lista on iteroitu. else { return false; } } @Override public E next() throws NoSuchElementException { // Alkio on saatavilla. if (hasNext()) { // Asetetaan apuviite nykyiseen alkioon. E alkio = pino.alkiot().get(nykyisenPaikanIndeksi); // Siirrytään seuraavaan paikkaan. nykyisenPaikanIndeksi++; // Palautetaan viite nykyiseen alkioon. return alkio; } // Kaikki alkiot on käsitelty. else { throw new NoSuchElementException("Pino on käyty läpi!"); } } }