# Hashtable ausgeben



## Vril (8. Jan 2005)

Hallo,
habe foglendes Problem:
Und zwar wird bei meinem Programm der Inhalt des Hashtables nicht ausgegeben. Nur folgendes:
saft@82ba41
saft@923e39
saft@130c19b
usw.


```
import java.util.*; 
import IOTools.*; 

class saft { 
    
   private String typ; private double vol, preis; 
    
   public saft (String typ, double vol, double preis){ 
      this.typ = typ; 
      this.vol = vol; 
      this.preis = preis; 
   } 
   public String getTyp(){ 
      return typ; 
   } 
   public double getVol(){ 
      return vol; 
   } 
   public double getPreis(){ 
      return preis; 
   } 
}
public class Saftladen_Neu { 
    
   private double ges_vol, ges_preis; 
    
   public void bestellen(Hashtable sortiment) { 
       
      System.out.print("Welchen Saft?:\t"); 
      String typ = ReadSimple.readString(); 
       
      if (sortiment.get(typ) != null){ 
         saft current = (saft)sortiment.get(typ);   // Hilfsvariable (geht ohne new ?) 
         System.out.print("Wieviel Flaschen ?:\t"); 
         int anzahl = Integer.parseInt(ReadSimple.readString()); // mit der scheiß ReadInteger gibts Bugs 
         ges_vol = ges_vol + (anzahl*current.getVol()); 
         ges_preis = ges_preis + (anzahl*current.getPreis()); 
      } 
      else 
      System.out.println("Den Saft hamma ned."); 
          
      System.out.print("Weitere Saefte kaufen (j/n) ?"); 
      if ((ReadSimple.readString()).equalsIgnoreCase("J")) 
         bestellen(sortiment); 
      else 
      System.out.println("Gesamt-Menge: "+ges_vol+" Liter\nGesamtpreis: "+ges_preis+" eur");          
   } 
   public static void main (String []args){ 
     
   Hashtable my_sortiment = new Hashtable();    
   my_sortiment.put("Orangensaft",     new saft("Orangensaft", 0.75 , 0.89)); 
   my_sortiment.put("Apfelsaft",       new saft("Apfelsaft", 1.0 , 1.29)); 
   my_sortiment.put("Tomatensaft",     new saft("Tomatensaft", 0.5 , 0.75)); 
   my_sortiment.put("Multivitaminsaft", new saft("Multivitaminsaft", 0.7 , 1.19)); 
      
   System.out.println ("Folgende Saefte habe wir im Angebot: \n");
		for (Enumeration e = my_sortiment.elements();
		e.hasMoreElements () ;) {
			System.out.print (e.nextElement());
			if (e.hasMoreElements ())
			System.out.println (" ");
			else
			System.out.println ();
   }
   Saftladen_Neu mcd_Juices = new Saftladen_Neu(); 
   mcd_Juices.bestellen(my_sortiment); 
   } 
}
```
Also die Werte nach "Orangensaft" kann man ja nicht ausgeben?
Aber wie schaffe ich es das die Saftarten Orangensaft, Apfelsaft usw. ausgegeben werden?

Kann mir jemand helfen?


----------



## 8ull23y3 (8. Jan 2005)

Also ich glaube deine Kontrollschleife ist nicht ganz vollständig...

probier doch mal while


```
Enumeration e = my_sortiment.elements();
   while ( e.hasMoreElements () ) {
         System.out.print (e.nextElement());
      
         if ( e.hasMoreElements () )
          System.out.println (" ");
         else
          System.out.println ();
   }
```

Vielleicht geht das... Geb keine Garantie und schlag mich net wenns nich geht!  :roll:


----------



## Beni (8. Jan 2005)

Dieser Befehl hier:

```
System.out.print (e.nextElement());
```
übergibt der print-Methode ein Object. Da die print-Methode keine Ahnung hat, was das für ein Object ist, ruft sie die Methode "toString" (welche jedes Object besitzt) auf, und gibt deren Rückgabewert aus.
Wenn man die "toString"-Methode nicht überschreibt, gibt sie _Klassenname + @ + Identifikationsnummer_ aus, also ziemlich das was du in deiner Ausgabe hast.
Du musst also dafür sorgen, dass die "toString"-Methode dieser Objekte die der print-Methode übergeben werden (und das sind alles Instanzen von _Saft_) etwas anderes zurückgibt.


```
public class Saft{
  [...] // Was du bis jetzt geschrieben hast

  public String toString(){
    return saftName;   // die überschriebene toString-Methode
  }
}
```


----------



## Vril (8. Jan 2005)

@Beni
Danke, hat funktioniert!

Noch eine kurze Frage zum Hashtable.
Und zwar wird der Hashtable ja immer "durcheinander" ausgegeben, also nicht der Reihe nach wie er im Code steht. Gibt es eine Möglichkeit den Hashtable der Reihe nach, also so wie er im Code auch steht, auszugeben?


----------



## Beni (8. Jan 2005)

Nein, die Information der Reihenfolge geht beim Einfügen in eine Hashtable verloren. Du könntest die Schlüssel in einer Liste speichern (ArrayList, LinkedList, ...), dann hast du die Reihenfolge noch (aber ob sich der Aufwand lohnt...).


----------

