Oppgave 2
package hjelpeklasser; import java.util.*; public abstract class AbstraktListeextends AbstraktBeholder implements Liste { public abstract void leggInn(int indeks, T t); protected void indeksKontroll(int indeks) { if (indeks < 0 ) throw new IndexOutOfBoundsException("Indeks " + indeks + " er negativ!"); else if (indeks >= antall()) throw new IndexOutOfBoundsException("Indeks " + indeks + " >= antall(" + antall() + ") noder!"); } public boolean leggInn(T t) { leggInn(antall(),t); return true; } public T hent(int indeks) { indeksKontroll(indeks); Iterator<T> i = iterator(); for (int k = 0; k < indeks; k++) i.next(); return i.next(); } public int indeksTil(T t) { Iterator<T> i = iterator(); for (int indeks = 0; i.hasNext(); indeks++) { if (i.next().equals(t)) return indeks; } return -1; } public T oppdater(int indeks, T t) { indeksKontroll(indeks); T gammel = fjern(indeks); leggInn(indeks,t); return gammel; } public T fjern(int indeks) { indeksKontroll(indeks); Iterator<T> i = iterator(); for (int k = 0; k < indeks; k++) i.next(); T temp = i.next(); i.remove(); return temp; } } // AbstraktListe
Oppgave 3
package hjelpeklasser; import java.util.*; public class EnkelTabellListe<T> extends AbstraktListe<T> { private T[] a; private int antall; public EnkelTabellListe() // konstruktør { this(10); // bruker 10 som startdimensjon } public EnkelTabellListe(int størrelse) // konstruktør { a = (T[])new Object[størrelse]; antall = 0; } public EnkelTabellListe(Iterable<T> itererbar) // konstruktør { for (T verdi : itererbar) leggInn(verdi); } public void leggInn(int indeks, T verdi) { if (verdi == null) throw new IllegalArgumentException("Ulovlig å legge inn null-verdier!"); if (indeks < 0 || indeks > antall) throw new IndexOutOfBoundsException("Indeks " + indeks + " er ulovlig!"); // En full tabell utvides med 50% if (antall == a.length) a = Arrays.copyOf(a,(3*antall)/2 + 1); // rydder plass til den nye verdien for (int i = antall; i > indeks; i--) a[i] = a[i-1]; a[indeks] = verdi; // setter inn ny verdi antall++; } private class EnkelTabellListeIterator implements Iterator<T> { private int denne = 0; // instansvariabel private boolean removeOK = false; // ny instansvariabel public boolean hasNext() // sjekker om det er flere igjen { return denne < antall; // sjekker verdien til denne } public T next() // ny versjon { if (!hasNext()) throw new NoSuchElementException("Tomt eller ingen verdier igjen!"); T temp = a[denne]; // henter aktuell verdi denne++; // flytter indeksen removeOK = true; // nå kan remove() kalles return temp; // returnerer verdien } public void remove() { if (!removeOK) throw new IllegalStateException("Ulovlig tilstand!"); removeOK = false; // remove() kan ikke kalles på nytt // verdien i posisjon denne - 1 skal fjernes siden den ble returnert // i det siste kallet på next(), verdiene fra og med denne flyttes // derfor en enhet mot venstre antall--; // en verdi vil bli fjernet denne--; // denne må flyttes til venstre for (int i = denne; i < antall; i++) { a[i] = a[i+1]; // verdiene flyttes } a[antall] = null; // verdien som lå lengst til høyre nulles } } // class EnkelTabellListeIterator public Iterator<T> iterator() { return new EnkelTabellListeIterator(); } } // class EnkelTabellListe