Løsningsforslag - oppgaver i Avsnitt 7.2.4


Oppgave 1

runde   c   ordbok   s   utskrift kode nestekode
0A A 65256
1BAB - 256B6566257
2ABA - 257A6665258
3AAA - 258A6565259
4A AA 258 
5   258  

Oppgave 2

Bruk f.eks. flg. melding: "ABABCABCABCAD". Da vil den først delen "ABABC" gjøre at "ABC" havner i ordboken. Setter vi Tegn = A og Ord = "BC", så kommer Tegn+Ord+Tegn+Ord+Tegn = "ABCABCA" deretter.

Oppgave 3

Kodene til ordene som legges inn i ordboken er fortløpende tall fra og med 256. Dermed kan disse isteden fungere som indekser i en ArrayList. Den første (tallet 256) legger vi inn på indeks 0, den neste på indeks 1, osv.

  public static String dekomprimer(List<Integer> koder)
  {
    int kode = koder.get(0);                       // første tallkode er < 256
    String t;                                      // foreløpig udefinert
    String s = String.valueOf((char) kode);        // ord med ett tegn
    char c;                                        // foreløpig udefinert

    StringBuilder resultat = new StringBuilder(s); // til å lagre resultatet

    List<String> ordbok = new ArrayList<>();

    for (int i = 1; i < koder.size(); i++)        // resten av tallene
    {
      kode = koder.get(i);                        // neste tall
      t = s;                                      // t settes lik s

      if (kode < ordbok.size() + 256)             // kode er i ordboken
      {

        s = kode < 256 ? String.valueOf((char) kode) // ny verdi for s
            : ordbok.get(kode - 256);

        c = s.charAt(0);                          // c lik første tegn i s
      }
      else                                        // kode er ikke i ordboken
      {
        c = t.charAt(0);                          // c lik første tegn i t
        s = t + c;                                // s lik t + c
      }

      resultat.append(s);                         // legger s i resultatet
      ordbok.add(t + s);                          // legger inn i ordboken
    }

    return resultat.toString();
  }