P. Pfahler, E. Stümpel

Programmieren in Java, Winter 1997/98

3. Übungsblatt, Lösungsvorschlag


Aufgabe 4 (Innere Klassen und Iteratoren)

In dieser Aufgabe sollte die Klasse LinkedList von der Vorlesungsfolie 72 erweitert werden. Die wesentliche Erweiterung bestand in der Einführung einer Iterators lili_iterator zum Listendurchlauf. Dieser Iterator wird realisiert durch eine Implementierung des public interface java.util.Enumeration aus dem package java.util.

Enumeration "verspricht" die Implementierung der folgenden Methoden:

Die für unseren Fall passende Implementierung ist unten angegeben.

LinkedList.java zum Mitnehmen


//LinkedList.java

import java.util.*;

   public class LinkedList
   { 
     // interface Verkettungselement
     public static interface Linkable
     { public Linkable getNext();
       public void setNext(Linkable n);
     }
     
     // kopf der liste:
     Linkable head;
     
     // vorne einfügen: (entspricht dem vorigen insert(Linkable n)
     public void insert_front(Linkable n)
     { n.setNext(head);
       head = n;
     }

     // hinten einfügen: (NEU!)

     public void insert_back(Linkable n)
       {
	 if (head == null)
	   head = n;
       else 
	 { Linkable tmp = head;
	   while (tmp.getNext() != null)
	     tmp = tmp.getNext();
	   tmp.setNext(n);
	 }
       }
    
     // Kopfzugriff:
     public Linkable getHead()
     { return head;
     }

     // und hier der Iterator zum Listendurchlauf:
     class lili_iterator implements Enumeration
     {
       Linkable pos = head;
       public boolean hasMoreElements()
	 {
	   return pos != null;
	 }
       public Object nextElement()
       throws NoSuchElementException
	 {
	   if (pos == null)
	     throw new NoSuchElementException("Lili");
	   else 
	     { Object res = pos;
	       pos = pos.getNext();
	       return res;
	     }
	 }
     }

   }

Anmerkung:

Im Hauptprogramm wird der Iterator durch Enumeration e = li.new lili_iterator() direkt erzeugt. Dies geht weil wir die innere Elementklasse lili_iterator hier public deklariert haben (vgl. Folie 85).


Aufgabe 5 (Scrabble)

Hier sollte ein Java - Programm geschrieben werden, daß für einen über die Kommandozeile eingegebenen Buchstabenvorrat (ein String) prüft, welche Worte eines Wörterbuchs sich mit diesem Vorrat bilden lassen, und diese dann als Ergebnis ausgibt.

Idee für die Implementierung der Klasse Scrabble:

Der Vollständigkeit halber ist hier auch das Hauptprogramm mit angegeben.

Srabble.java zum Mitnehmen


// Scrabble.java
public class Scrabble
{ public static boolean geht(String vorat, String wort)
  { boolean benutzt[] = new boolean[vorat.length()];  
    for (int i = 0; i < benutzt.length; i++)
      benutzt[i] = false;
    // fuer jeden Buchstaben in wort
    for (int i = 0; i < wort.length(); i++)
    { // fuer die Buchstaben in vorat
      int j;
      for (j = 0; j < vorat.length(); j++)
	{ if (wort.charAt(i) == vorat.charAt(j) && !benutzt[j])
	   { // den nehmen wir
	     benutzt[j] = true;
	     break; // naechste Runde in der äusseren Schleife
	   }
	}
      if (j == vorat.length())
	// Buchstabe wort.charAt(i) ist nicht verfügbar
	return false;
    }
    return true;
  }
}


// ScrabbleMain.java
import java.io.*;
public class ScrabbleMain
{ public static void main(String argv[]) throws java.io.IOException
  { String vorat = argv[0];		//eingegebener Buchstabenvorrat
    File f = new File("german.3-6");	//das Wörterbuch
    BufferedReader in = new BufferedReader(new FileReader(f));
    for (;;) // forever
      { String line = in.readLine();
        if (line == null)		//nichts mehr zu lesen
	  break;
	if (Scrabble.geht(vorat, line))	//Wort aus Vorrat erzeugbar?
	  System.out.println(line);	//ja, also ausgeben!
      }
  }
}

Der Aufruf java ScrabbleMain ESTHER erzeugt beispielsweise die folgende Ausgabe:

EHE
EHER
EHRE
EHRST
EHRT
EHRTE
ERST
ETH
HEER
HEERS
HER
REH
REHE
REST
RESTE
SEE
SEH
SEHE
SEHER
SEHR
SEHT
SET
STE
STEH
STEHE
STEHER
TEERS
THE
THER
THESE