import java.util.Iterator; public class Rekkehus implements Iterable { private int antall = 0; private Hus foerste, siste = null; // public void leggTil(E element) { // legger til på slutten av lista // Hus hus = new Hus(element); // if (antall == 0) { // sjekker om lista er tom, da er det enkelt // foerste = hus; // siste = hus; // } // else { // siste.settNeste(hus); // hus.settForrige(siste); // siste = hus; // } // antall++; // } public void leggTil(E element) { // En sortert prioritetskø, fra minst til størst Hus hus = new Hus(element); if (antall() == 0) { foerste = siste = hus; antall++; hus.settPos(antall); } else { Hus peker = foerste; antall++; while (peker.hentNeste() != null && peker.compareTo(hus) < 0) { peker = peker.hentNeste(); } // peker er IKKE null OG (peker skal være STØRRE enn hus ELLER peker = siste hus) //hvis peker er første, må vi sjekke på nytt, for da har ikke while-løkka blitt utført if (peker == foerste && peker.compareTo(hus) > 0) { // må sjekke om peker er større enn hus, merk at krokodillen spiser motsatt retning i if-sjekken hus.settNeste(foerste); foerste.settForrige(hus); foerste = hus; hus.settPos(1); for (int i = peker.hentPos() + 1; i <= antall(); i++) { peker.settPos(i); peker = peker.hentNeste(); } } // hvis peker er siste, må vi sjekke på nytt, for da vet vi ikke om den siste er større enn hus, eller om peker bare stoppet der fordi peker.hentNeste() er null else if (peker == siste && peker.compareTo(hus) < 0) { siste.settNeste(hus); hus.settForrige(siste); siste = hus; hus.settPos(antall); } //hvis vi er et sted mellom foerste og siste, peker ER STØRRE enn hus else { peker.hentForrige().settNeste(hus); hus.settForrige(peker.hentForrige()); hus.settNeste(peker); peker.settForrige(hus); hus.settPos(peker.hentPos()); for (int i = peker.hentPos() + 1; i <= antall(); i++) { peker.settPos(i); peker = peker.hentNeste(); } } } } public void fjern() { // fjerner fra starten av lista if (antall == 1) { foerste = siste = null; antall--; } else if (antall > 1) { siste.hentForrige().settNeste(null); siste = siste.hentForrige(); antall--; } } public String toString() { // returnerer info om rekken med hus String streng = "Rekken består av " + this.antall() + " hus: \n \n"; if (antall() == 0) { return streng; } else { Hus peker = foerste; while (peker != null) { streng += peker.tegnHus() + "\n \n"; peker = peker.hentNeste(); } } return streng; } public int antall() { // Nytt return antall; } @Override public Iterator iterator() { return new RekkehusIterator(); } // indre klasse som skal holde på et element, vet ikke hvilken type protected class Hus implements Comparable { // ofte kalt Node Hus neste, forrige = null; E data; int posisjon; public Hus(E data) { // E kan være hvilken som helst type this.data = data; } public E hentData() { return data; } public void settNeste(Hus hus) { this.neste = hus; } public void settForrige(Hus hus) { this.forrige = hus; } public Hus hentNeste() { return neste; } public Hus hentForrige() { return forrige; } public String hentInfo() { String streng = "Hus: "; streng += data; return streng; } public String tegnHus() { String tegning = " /\\ \n" + " / \\ \n" + " /____\\ \n" + "| |\n" + "| " + data + " |\n" + "|______|"; return tegning; } @Override // For A.compareTo(B) --> Returnerer et positivt tall hvis A er større enn B public int compareTo(Hus hus) { String hus1 = this.data.toString(); String hus2 = hus.data.toString(); return hus1.compareTo(hus2); } public void settPos(int posisjon) { this.posisjon = posisjon; } public int hentPos() { return posisjon; } } public class RekkehusIterator implements Iterator { private Hus peker = foerste; @Override public boolean hasNext() { return peker != null; } @Override public E next() { E data = peker.hentData(); peker = peker.hentNeste(); return data; } } }