Suche Beispiele bzw. Übungen über "hashtable"

Hi,

ich suche mehrere Beispiele bzw. Übungen über Hastable. In dem Lernheft steht leider
nicht viel zu erklären, was mich etwas frustiert macht. Und mit diesem Thema muß ich eine Aufgabe noch erledigen, noch keine konkrete Lösungen gefunden, seufz…
Brauche erste mal ein paar Tipps von euch.

Die Aufgabe werde ich euch später zeigen. Was oben betrifft, brauche ich es unbedingt.
Kann einer mir das hier geben?

Cu yampi

Was genau fehlt dir zum Verständnis der Klasse Hashtable?

Eigentlich sollte man keine Übungen zu “Hashtable” machen. Hashtable ist nur eine (sehr spezielle) Implementierung einer “Map” ( http://java.sun.com/javase/6/docs/api/java/util/Map.html ).

Was ist das denn für ein “Lehrbuch”? Kann es sein, dass das etwas veraltet ist? Man sollte eigentlich NIE sehen, dass man mit einer Hashtable rumhantiert, außer natürlich dort, wo man sie erstellt.

Ganz allgemein verwendet man eine Map (zum Beispiel eine Hashtable) wenn man eine “Zuordnung” von einem Element zum anderen herstellen will. Man kann damit ein Objekt auf (genau) ein anderes Objekt abbilden.


Map<String, Integer> map = new Hashtable<String, Integer>(); 

map.put("Hallo", 1);
map.put("Welt", 2);
map.put("X", 3);
map.put("X", 4);

System.out.println(map.get("Hallo")); // Gibt 1 aus
System.out.println(map.get("Welt")); // Gibt 2 aus
System.out.println(map.get("X")); // Gibt 4 aus
System.out.println(map.get("YYY")); // Gibt 'null' aus

Kannst auch mal hier schauen http://java.sun.com/docs/books/tutorial/collections/index.html

L-ectron-X,

public Object get (Object key)```
Diese beiden Methoden sind in der Hashtabelle gespeichert.

Object => Ganzzahl (Integer, Double, Character etc.) 
put => einfügen
get => zurückgeben

Das ist mir klar, aber was zum Beispiel, hier:

```Hashtable<Integer, key> test = new Hashtable<Integer, value>();```
Dies kapiere ich nicht. Weißt Du, was das bedeutet? 

Marco13, 

> Eigentlich sollte man keine Übungen zu "Hashtable" machen. Hashtable ist nur eine (sehr spezielle) Implementierung einer "Map" ( http://java.sun.com/javase/6/docs/ap.../util/Map.html ). 

Map => ist es eine Abbildung ("Mapping")? Oh je...das in englischer Sprache muß ich 
mehrmals lesen. Trotzdem okay! :-)

Das Lernheft kommt vom SGD Darmstadt. Veraltet? Das kann nicht sein. Das über 
Hashtable (Adressverzeichnis, Hashcode, Hashmap usw.) steht drin. Jedoch wird das 
nicht genug erklärt. Nur drei Seiten von 100 Seiten! Reicht das doch oder nicht?

Na gut, ich konzentriere mich auf Dein Beispiel. ;-)

Ja, eine Hashtable ist auch nur eine Map (wie TreeMap, HashMap… (der Unterschied zwischen HashMap und Hashtable ist im Moment nicht so wichtig)

[QUOTE=yampi]
Das Lernheft kommt vom SGD Darmstadt. Veraltet? Das kann nicht sein. [/QUOTE]

Was macht dich da so sicher? Also, du brauchst jetzt keine “Angst” zu haben: Du lernst ja nichts “falsches” - nur etwas, was man heutzutage vielleicht “besser” machen könnte.

Btw sowas hier:
Hashtable<Integer, key> test = new Hashtable<Integer, value>();
ist aber eigentlich syntaktisch falsch: Das “key” und “value” sollte in dieser Form nicht dastehen. Wenn man sowas schreibt wie
Hashtable<Integer, String> test = new Hashtable<Integer, String>();
dann bedeutet das: Erstelle mir eine Hashtable namens ‘test’, die Integer-Werte auf Strings abbildet.

Die Doku zu “get” und “put” sollte eigentlich eher wie das hier aussehen, aber … vielleicht ist das auch der Grund für die andere Frage: Wenn du mit den < spitzen Klammern > nichts anfangen kannst, dann habt ihr http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html vermutlich noch nicht durchgenommen. Kommt (hoffentlich) noch.

Man kann an dieser Stelle denk ich auch erstmal die Generics weglassen. Vor Java 5 gabs die sowieso noch nicht. Wenn Ihr diese dann mal behandelt weißt Du nachher auch wozu sie gut sind, also nicht unnötig davon verunsichern lassen, lieber weglassen da sie eh „optional“ sind, wenn auch gut aber das kommt ja wie gesagt später :wink:

Gut Schuß
VuuRWerK :wink:

Das mit der “spitzen” und “normalen” Klammern ist aber unterschiedlich, nicht wahr?

Unter obigen Links gibt dort ein paar Beispiele mit unterschiedlichen Klammern. Da muß
ich aufpassen, was richtig passt oder so.

Ich will eine Übung machen und weiß nicht, wie es funktioniert.

RechteckDatenstruktur.java

public class RechteckDatenstruktur extends java.util.Hashtable
{

        public static void main(String[] args)
        {
                Hashtable<Integer, Rechteck> test = new Hashtable<Integer, Rechteck>();

                
                test.put(new Integer(0),new Rechteck(123,123));
                test.put(new Integer(1),new Rechteck(124,56));
                test.put(new Integer(2),new Rechteck(56,127));
                test.put(new Integer(3),new Rechteck(45,65));
                test.put(new Integer(4),new Rechteck(23,32));
                test.put(new Integer(5),new Rechteck(61,85));
                test.put(new Integer(6),new Rechteck(55,55));

                Kreis elementVier = (Rechteck)test.get(3);

                // Ausgabe der X-/Y-Koordinaten
                System.out.println("X-Koordinate lautet: " + elementVier.getX());
                System.out.println("Y-Koordinate lautet: " + elementVier.getY());

        }
}

Sagt mir, wo nicht korrekt ist oder so…

Meint Ihr das, dass es von der Konstruktormethode abhängt? Wenn ja, muß ich was in dieser Konstruktormethode einfügen?

Das “extends java.util.Hashtable” kann glaubich weg. Deine Klasse verwendet eine Hashtable. Durch das “extends java.util.Hashtable” sagst du: Deine Klasse IST eine Hashtable. (Das kann man zwar machen, ist aber im allgemeinen (und für diesen Test) nicht sinnvoll).

Bei
Kreis elementVier = (Rechteck)test.get(3);
müßte es eine ClassCastException geben: Du legst eine “Rechteck” in die Map, und versuchst dann, das als “Kreis” wieder rauszuholen.

Mit
Rechteck elementVier = test.get(3);
sollte es aber gehen (sofern Rechteck auch “getX” und “getY” anbietet)

{

        public static void main(String[] args)
        {
                Hashtable<Integer, Rechteck> test = new Hashtable<Integer, Rechteck>();

                
                test.put(new Integer(0),new Rechteck(123,123));
                test.put(new Integer(1),new Rechteck(124,56));
                test.put(new Integer(2),new Rechteck(56,127));
                test.put(new Integer(3),new Rechteck(45,65));
                test.put(new Integer(4),new Rechteck(23,32));
                test.put(new Integer(5),new Rechteck(61,85));
                test.put(new Integer(6),new Rechteck(55,55));

                Rechteck elementVier = (Rechteck)test.get(3);

                // Ausgabe der X-/Y-Koordinaten
                System.out.println("X-Koordinate lautet: " + elementVier.getX());
                System.out.println("Y-Koordinate lautet: " + elementVier.getY());

        }
}```

Erstens habe ich "extends java.util.hashtable" rausgenommen und zweitens "Rechteck" 
geändert! 
Danach habe ich es kompiliert. -> javac RechteckDatenstruktur.java 
Fehlermeldung ist nun darauf zugekommen:

cannot find symbol
symbol: constructor Rechteck(int,int)
location: class Rechteck
test.put<new Integer(0), new Rechteck(123,123)>;


Heißt das, dass in der Kontruktormethode (**Rechteck.java**) davon fehlt, oder?
cannot find symbol symbol: constructor Rechteck(int,int) 

Das heißt, dass es den Konstruktor Rechteck(int, int) nicht gibt.

Wenn es einen gäbe, müsste das ungefähr so aussehen:


 //Das ist der Konstruktor, der da sein soll, aber so wie es aussieht nicht existiert:
 public Rechteck(int argument1, int argument2) {
  //tu irgendwas
 }

}```

Gruß,
pcworld

Ich habe einen Fehler entdeckt!

Aus der Konstruktur namens Rechteck.java:

   {
      this.x = x;
      this.y = y;
      this.breite = breite;
      this.hoehe = hoehe;
   }```
```test.put(new Integer(0),new Rechteck(123,123));```
Das ist nicht korrekt. Zwei Zahlen müssen dazu sein. Hier:
```test.put(new Integer(0),new Rechteck(123,123,144,144));```
Nach dem ich das kompiliert habe, ist die Fehlermeldung immer noch da, 
aber nicht so wie eben, sondern:

cannot find symbol
symbol: class Hashtable
location: RechteckDatenstruktur
Hashtable<Integer, Rechteck> test = new Hashtable<Integer, Rechteck>();


Kann das sein, dass dies in der Konstruktormethode fehlt?

Kann es sein, dass du in der Klasse RechteckDatenstruktur den Import der Hashtable vergessen hast?:
import java.util.Hashtable;

Gruß,
pcworld
PS: Für sowas ist Eclipse nicht schlecht. Da wird das am Rand mit so einer Birne direkt in der Zeile angezeigt, in der der Fehler ist, und wenn du auf diese Birne klickst, bekommst du gleich ein paar Vorschläge zur Fehlerbehebung. Und auch wird über einen Tooltip nochmal genauert erläutert, was genau der Fehler ist.

Super, das funktioniert! Die Ausgabe ist gekommen, korrekt!

Dann muß ich was mit Kreis erledigen, für die Einsendeaufgaben. :wink:

Nur eins, was ich wissen möchte, warum muß das nicht sein, hier:
„public class RechteckDatenstruktur extends java.util.Hashtable“

Was ist der Unterschied zwischen „extends java.util.Hashtable“ und „import
java.util.Hashtable“?

Kann Elipse irgendwelche Fehlerdiagnose schnell rausfinden und was vorschlagen,
oder wie? :-o

Es erkennt Fehler schon vor dem Kompilieren. NetBeans macht das übrigens auch…
Aber bleib erst mal bei deinem Java-Editor, so lernst du mehr.

Rectangle hat übrigens mehrere Konstruktoren, einer davon lässt auch die Übergabe von zwei ganzen Zahlen (int) zu.
[http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Rectangle.html#Rectangle(int, int)](http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Rectangle.html#Rectangle(int, int))

Es muss also nicht unbedingt ein Fehler sein. Es kommt darauf an, wie dein fertig erzeugtes Rechteck “aussehen” soll.

[QUOTE=yampi]Nur eins, was ich wissen möchte, warum muß das nicht sein, hier:
„public class RechteckDatenstruktur extends java.util.Hashtable“[/QUOTE]
Siehe Post von Marco13.

Das mit dem extends siehe mein Link.
Ein Import bringt nur, dass du dir Tipparbeit sparst. Wenn du „import java.util.Hashtable“ schreibst, dann kannst du die Hashtable in deinem Code wiefolgt nutzen:
Hashtable<String, String> hashtable = new Hashtable<String, String>();
Wenn du den Import weglässt, musst du die Paketdeklaration mit angeben:
java.util.Hashtable<String, String> hashtable = new java.util.Hashtable<String, String>();
Ansonsten überflieg mal das da: Java ist auch eine Insel: Import

Ja. Bei IDEs würde jetzt z. B. der Vorschlag gemacht werden, ob du die Klasse importieren oder erstellen willst. Aber wie schon erwähnt wurde, bleib erstmal bei deinem Java-Editor als Anfänger. :wink:

Gruß,
pcworld

Jetzt habe ich das im Griff. Für eure Hilfe bedanke ich mich sehr. :slight_smile: