import java.util.ArrayList; import java.util.Iterator; import java.util.NoSuchElementException; /* Dette er nytt materiale som vi ikke rakk i gruppetimen. Her demonstrerer vi hvordan Iterable- og Iterator-interfacene implementeres i koden. Studér koden nøye og sørg for at du ser hva som foregår. MERK: At typen (i krokodilletegnene) markerer hva slags type som skal itereres gjennom, i dette tilfellet Matvare-objekter. */ public class Handleliste implements Iterable { private ArrayList matvareListe = new ArrayList<>(); private String navn; public Handleliste(String na) { navn = na; } public void leggTilVare(Matvare vare) { matvareListe.add(vare); } // Denne metoden arves fra iterable-interfacet, det krever at vi returnere et objekt av en klasse, som implementerer Iterator-interfacet @Override public Iterator iterator() { return new HandlelisteIterator(); } // Dette er en privat klasse som implementerer Iterator-interfacet private class HandlelisteIterator implements Iterator { // Det er viktig at Iterator-klassen har en oversikt over hvor vi er i lista private int indeks = 0; // Har vi nådd slutten av lista? Dette må programmeren avgjøre gjennom hasNext()-metoden @Override public boolean hasNext() { return indeks < matvareListe.size(); } // Hente det neste elementet, dersom det er flere å hente @Override public Matvare next() { if (! hasNext()) { throw new NoSuchElementException("ingen flere varer"); } // Koden under kan skrives på én linje for de som er opptatte av slikt, men dette viser tydelig hva som skjer Matvare retur = matvareListe.get(indeks); // VIKTIG AT INDEKSEN ØKES (eller at listen går fremover)! Ellers vil vi kun hente det samme elementet hele tiden. indeks++; return retur; } } }