Løsningsforslag - oppgaver i Avsnitt 3.2.1


Oppgave 2

package hjelpeklasser;

import java.util.*;

public abstract class AbstraktListe extends 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