# Binärbaum mittels TreeMap



## metacortex (4. Juli 2004)

Hallo,
ich suche nach einer Möglichkeit Aktienobjekte in einem Binärbaum zu verwalten. Ich möchte dazu die von Java bereitgestellt Klasse TreeMap verwenden.

Ich habe schon rudimentär ein Verwaltungsprogramm geschrieben, das eigentlich die o.g. Funktionalität zur Verfügung stellen sollte, aber irgendwie funktioniert es doch nicht so richtig, da bereits beim Compilieren diverse Fehler auftreten. beispielsweise erwartet der Compiler bei der get.Methode eines TreeMaps ein java.lang.Object. Ich kann jedoch nur Objecte vom Typ AKTIE anbieten & weiß nicht so recht, wie man diese ineinander umwandeln kann.

Außerdem weiß ich nicht, mal angenommen der Baum würde soweit funktionieren, daß man Objecte in den Baum hängen kann, sie auslesen und manipulieren kann sowie eben auch einzelne Knoten löschen kann (das müßte ja alles mittels TreeMap möglich sein), wie ich dann die zurückgelieferten Daten z.B. in ein Binärfile (also eine Sequentielle Datei) schreiben kann und was ich ebenfalls nicht weiß: Wie schreibt man beliebige Ausgaben (sagen wir mal Text) ein ein Textfile.

Ich habe den Quelltext mal angehängt...
Klasse Aktie:

```
public class Aktie  {
   private  String wkn;
            String name;
            String boerse;
            float kurs;
    
    Aktie (String wkn, String name, String boerse, float kurs)    {
	this.wkn = new String(wkn);
	this.name = new String(name);
	this.boerse = new String(boerse);
	this.kurs = kurs;
	 }

    Aktie (String name, String boerse, float kurs)   {
	this.name = new String(name);
	this.boerse = new String(boerse);
	this.kurs = kurs;
          }

    public String toString()    {
	return "wkn: "+wkn+ ", Name: " + name + ", Boerse: " + boerse +
	    ", Kurs: " + Float.toString(kurs);
         }

    
    public String aktienInfo()    {
        return "Name: " + name + ", Boerse: " + boerse +
	    ", Kurs: " + Float.toString(kurs);
        }

    public String getKey()  {
	return wkn;
          }
    

}
```

Klasse TreeMapStockTest (das eigentliche Programm):

```
import java.util.*;
import java.io.*;
import java.awt.*;

class TreeMapStockTest {

  public static void main (String[] args) {
    String eingabe = new String("");
    TreeMap map = new TreeMap();
    int j = 1;
    String keyinput = "";
    String info_name = "";
    String info_boerse = "";
    String ik = "";
    
    
    System.out.println("Aktienprogramm");
    System.out.println("****************************");

    for (;j == 1;) {
      System.out.println("\nMenue:");
      System.out.println("? - Existiert key im Baum?");
      System.out.println("A - Abfragen der info zu vorgegebenem key");
      System.out.println("B - Baum in Binaerdatei schreiben (inorder)");
      System.out.println("E - Einfuegen (key, info)");
      System.out.println("L - Loesche Knoten (key, info) bei vorgegebenem key");
      System.out.println("S - Baum auf Bildschirm schreiben (inorder)");
      System.out.println("T - Baum in Textfile schreiben (inorder)");
      System.out.println("U - Info aendern bei vorgegebenem Key (Update)");
      System.out.println("X - Rahmenprogramm beenden");
      System.out.println("Bitte geben Sie nun Ihre Auswahl an: ");

      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      try {
        eingabe = in.readLine();
        } catch (IOException e) {
            System.out.println("Fehler bei der Eingabe.");
        }

      char [] input = eingabe.toCharArray();   // umwandeln des Strings in Char
      switch (input[0]) {
        case '?':
          System.out.println("\n\nSie moechten die Existens eines Key abfragen.");
          break;

        case 'A': case 'a':
          System.out.println("\n\nSie moechten die Info bei geg. Key abfragen.");
          System.out.println("Geben Sie den Key des entsprechenden Knotens ein: ");
          try {
            keyinput = in.readLine();
            } catch (IOException e) {
            System.out.println("Fehler bei der Eingabe.");
            }
          Aktie a = map.get(Aktie);
          a.aktienInfo();
          break;

        case 'B': case 'b':
          System.out.println("\n\nSie moechten den Baum als Binaerdatei schreiben.");
          break;

        case 'E': case 'e':
          System.out.println("\n\nSie moechten einen neuen Knoten einfuegen.");
          System.out.println("Geben Sie den Key des neuen Knotens ein: ");
          try {
            keyinput = in.readLine();
            } catch (IOException e) {
            System.out.println("Fehler bei der Eingabe.");
            }
          System.out.println("Geben Sie die Infodaten des neuen Knotens ein.. ");
          System.out.println("Name: ");
          try {
            info_name = in.readLine();
            } catch (IOException e) {
            System.out.println("Fehler bei der Eingabe.");
            }
          System.out.println("Boerse: ");
          try {
            info_boerse = in.readLine();
            } catch (IOException e) {
            System.out.println("Fehler bei der Eingabe.");
            }
          System.out.println("Kurs: ");
          try {
            ik = in.readLine();
            } catch (IOException e) {
            System.out.println("Fehler bei der Eingabe.");
            }
          float info_kurs;
          info_kurs = Float.valueOf(ik).floatValue();
          Aktie Akt = new Aktie(info_name, info_boerse, info_kurs);
          map.put(keyinput, Akt);
          break;

        case 'L': case 'l':
          System.out.println("\n\nSie moechten einen Knoten loeschen.");
          System.out.println("Geben Sie den Key des zu loeschenden Knotens ein: ");
          try {
            keyinput = in.readLine();
            } catch (IOException e) {
            System.out.println("Fehler bei der Eingabe.");
            }
          map.remove(keyinput);
          break;

        case 'S': case 's':
          System.out.println("\n\nSie moechten den Baum auf dem Bildschirm ausgeben.");
          break;

        case 'T': case 't':
          System.out.println("\n\nSie moechten den Baum als Textdatei schreiben.");
          break;

        case 'U': case 'u':
          System.out.println("\n\nSie moechten die Info bei geg. Key aendern.");
          break;

        case 'X': case 'x':
          System.out.println("\n\n\nGoodbye...");
          j = 0;
          break;

        default : System.out.println("\n\n\nSorry, falsche Auswahl. Bitte erneut versuchen...");
        } // Ende Case
      }   // Ende der for-Schleife (die wie ein loop funktioniert)
  }
}
```

Wäre Klasse, wenn mir jemand mit o.g. Problemen (Arbeit mit TreeMap allgemein, verwenden von AKTIEN-Objekten in Bäumen (die ja wohl eigentlich Java.lang.Objects verlangen), Schreiben in ein Binärfile und Schreiben in ein Textfile) helfen könnte.


----------



## Cybernd (4. Juli 2004)

Aktie a = (Aktie) map.get...

Durch das (Aktie) wird der Rückgabewert gecastet. Somit weiß der compiler das du dir dessen bewußt bist, das hierbei ein Cast geschieht. Dieser kann nämlich zur Laufzeit fehlschlagen und somit zu einer entsprechenden Exception führen.

Wird sich mit Java 1.5 und den Generics erledigen. So oder so kommst du nicht drum herum dir Wissen zum Thema Polymorphie anzueignen.

http://www.galileocomputing.de/open...xjavainsel_020003535DieTypanpassungdasCasting
Kapitel 2.3.7 durchlesen.

hth
cybi


----------

