Løsningsforslag - oppgaver i Avsnitt 11.2.1


Oppgave 1

Pass på at dette kommer øverst:

import java.io.*;
import java.net.URL;

Konstruktøren:

  public VGraf(String url) throws IOException  // konstruktør - henter fra fil
  {
    try (BufferedReader inn = new BufferedReader  // leser fra fil
        (new InputStreamReader((new URL(url)).openStream())))
    {
      noder = new TreeMap<>();                 // oppretter en TreeMap

      String linje;
      while ((linje = inn.readLine()) != null)
      {
        String[] s = linje.split(" ");         // deler opp linjen

        String fra = s[0];                     // franode kommer først
        leggInnNode(fra);

        for (int i = 1; i < s.length; i += 2)  // går gjennom kantene
        {
          String til = s[i];                   // noden kanten går til
          int vekt = Integer.parseInt(s[i+1]); // kantens vekt

          leggInnNode(til);                    // legger inn tilnode
          leggInnKant(fra, til, vekt);         // legger inn kanten
        }
      }
    }
  }

Den indre klassen Kant skal ha denne metoden:

  @Override
  public String toString()
  {
    return "(" + til.navn + "," + vekt + ")";
  }

Den indre klassen Node skal ha denne metoden:

  @Override
  public String toString()
  {
    return navn;
  }

Oppgave 2

  public void skrivGraf(String filnavn) throws IOException
  {
    PrintWriter ut = new PrintWriter(filnavn);

    for (String nodenavn : this)  // bruker iteratoren i grafen
    {
      ut.print(nodenavn);
      Node node = noder.get(nodenavn);

      // bruker iteratoren i kantlisten
      for (Kant k : node.kanter)
      {
        ut.print(" " + k.til.navn + " " + k.vekt);
      }
      ut.println();
    }

    ut.close();
  }

Oppgave 3

  public int leggInnKant(String franode, String tilnode, int vekt)
  {
    if (franode.equals(tilnode)) throw    // sjekker om de er like
      new IllegalArgumentException(franode + " er lik " + tilnode + "!");

    Node fra = noder.get(franode);  // henter franode
    if (fra == null) throw new NoSuchElementException(franode + " er ukjent!");

    Node til = noder.get(tilnode);  // henter tilnode
    if (til == null) throw new NoSuchElementException(tilnode + " er ukjent!");

    // sjekker om kanten finnes fra før
    for (Kant kant : fra.kanter)   // går gjennom kantene
    {
      if (kant.til == til)
      {
        int gammelvekt = kant.vekt;
        kant.vekt = vekt;
        return gammelvekt;
      }
    }
    // dette er en ny kant
    fra.kanter.add(new Kant(til, vekt));  // legger til i kantlisten

    return vekt;
  }

Oppgave 4

  public boolean erKant(String franode, String tilnode)
  {
    Node fra = noder.get(franode);  // henter franode
    if (fra == null) throw new NoSuchElementException(franode + " er ukjent!");

    Node til = noder.get(tilnode);  // henter tilnode
    if (til == null) throw new NoSuchElementException(tilnode + " er ukjent!");

    for (Kant k : fra.kanter) if (k.til == til) return true;

    return false;
  }

Oppgave 5

  public boolean fjernKant(String franode, String tilnode)
  {
    Node fra = noder.get(franode);  // henter franode
    if (fra == null) throw new NoSuchElementException(franode + " er ukjent!");

    Node til = noder.get(tilnode);  // henter tilnode
    if (til == null) throw new NoSuchElementException(tilnode + " er ukjent!");

    for (Iterator<Kant> i = fra.kanter.iterator(); i.hasNext(); )
    {
      Kant k = i.next();
      if (k.til == til)
      {
        i.remove();   // fjerner den som nettopp er lest
        return true;  // kanten er fjernet
      }
    }
    return false;  // ingen kant
  }

Oppgave 6

  public String[] kantTabellFra(String node)
  {
    Node fra = noder.get(node);                      // henter noden
    if (fra == null) throw new NoSuchElementException(node + " er ukjent!");

    String[] tabell = new String[fra.kanter.size()];
    int i = 0;
    for (Kant k : fra.kanter) tabell[i++] = k.til.navn;
    return tabell;
  }

Oppgave 7

  public String[] kantTabellTil(String node)
  {
    Node til = noder.get(node);                      // henter noden
    if (til == null) throw new NoSuchElementException(node + " er ukjent!");

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

    for (String franode : noder.keySet())
    {
      for (Kant k : noder.get(franode).kanter)
      {
        if (k.til == til) liste.add(franode);
      }
    }

    return liste.toArray(new String[liste.size()]);
  }

Oppgave 8

  public boolean fjernNode(String node)
  {
    if (kantTabellFra(node).length == 0 && kantTabellTil(node).length == 0)
    {
      noder.remove(node);
      return true;
    }
    return false;
  }