Assoziatives Array in Java?
muenzchen
- java
0 Cheatah0 muenzchen0 Christian Kruse0 Martin Jung0 Cheatah0 Slyh
Hallo!
Und noch eine Javafrage :)
Wie sieht ein assoziatives Array in Java aus? Gobts das überhaupt? Ich konnte nirgendwo etwas darüber finden.
Hi,
Wie sieht ein assoziatives Array in Java aus? Gobts das überhaupt?
in Java gibt's alles.
Ich konnte nirgendwo etwas darüber finden.
Du hast nach einem Begriff gesucht, der außerhalb von PHP beinahe bedeutungsfrei ist. Suche nach "Hash". In Python wäre die Bezeichnung übrigens "Dictionary".
Cheatah
Hi,
Wie sieht ein assoziatives Array in Java aus? Gobts das überhaupt?
in Java gibt's alles.
Ich konnte nirgendwo etwas darüber finden.
Du hast nach einem Begriff gesucht, der außerhalb von PHP beinahe bedeutungsfrei ist. Suche nach "Hash". In Python wäre die Bezeichnung übrigens "Dictionary".
Cheatah
»»
Auf das bin ich auch gestoßen, nur war da nie etwas abgebildet worunter ich mir etwas vorstellen hätte können. Wie sieht denn so ein Hash aus?
Was ich gerne machen würde, ist eigentlich ganz simpel.
So wie in PHP
alter=>"34",
name=>"user",
...
das würde ich jetzt einfach gerne in Java realisieren.
Hi,
Wie sieht ein assoziatives Array in Java aus? Gobts das überhaupt?
http://www.javabuch.de/ - wenn Dir dieser Aufwand zu hoch sein sollte, lass es besser mit Java.
Viele Grüße,
Martin Jung
Hi,
Wie sieht ein assoziatives Array in Java aus? Gobts das überhaupt?
http://www.javabuch.de/ - wenn Dir dieser Aufwand zu hoch sein sollte, lass es besser mit Java.Viele Grüße,
Martin Jung
Danke, werd ich mir mal ansehen. Mir ist der Aufwand nicht zu groß, ich hab ja bereits ein Buch. Aber über Hashes ist da nix drin.
Hallo Cheatah,
Du hast nach einem Begriff gesucht, der außerhalb von PHP
beinahe bedeutungsfrei ist. Suche nach "Hash". In Python
wäre die Bezeichnung übrigens "Dictionary".
Korrekt waere in der Tat der Ausdruck 'Hashtable'. Und so
heisst auch die Java-Klasse: java.util.Hashtable. Muss man aber
mit aufpassen, die Methode 'exists' benutzt anscheinend kein
'equals', um das Vorhanden sein eines Keys zu pruefen, die
Methode 'get' allerdings schon.
Noch ein schoenes Beispiel, warum Java inkonsistent ist. Das
ist ueberigens *nicht* dokumentiert, das herauszufinden hat
mich ca. 3h gekostet.
Gruesse,
CK
Hi Christian,
...... java.util.Hashtable. Muss man aber
mit aufpassen, die Methode 'exists' benutzt anscheinend kein
'equals', um das Vorhanden sein eines Keys zu pruefen, die
Methode 'get' allerdings schon.
Welche Methode .exists() welchen Objekts?
Viele Grüße,
Martin Jung
Hallo Martin,
...... java.util.Hashtable. Muss man aber
mit aufpassen, die Methode 'exists' benutzt anscheinend
kein 'equals', um das Vorhanden sein eines Keys zu
pruefen, die Methode 'get' allerdings schon.
Welche Methode .exists() welchen Objekts?
Du meinst 'welcher Klasse'. Und du hast recht, die Methode,
die ich meinte, heisst 'containsKey':
http://java.sun.com/j2se/1.4.1/docs/api/java/util/Hashtable.html#containsKey(java.lang.Object)
Gruesse,
CK
Hi,
Du meinst 'welcher Klasse'.
Wenn man diese Differenzierung manchmal verbal mehr als 100mal am Tage macht, geht's dann beim 101. Male schief...
http://java.sun.com/j2se/1.4.1/docs/api/java/util/Hashtable.html#containsKey(java.lang.Object)
In 1.3.1 verhält es sich (sinngemäß, habe jetzt kein Diff gemacht) wie in Slyh's Beispiel.
Viele Grüße,
Martin Jung
Hi,
Muss man aber
mit aufpassen, die Methode 'exists' benutzt anscheinend kein
'equals', um das Vorhanden sein eines Keys zu pruefen, die
Methode 'get' allerdings schon.
interessenhalber: In welchem Kontext führt das zu Problemen? Eigentlich doch nur, wenn der Key "noch komplexer" als ein String ist, oder?
Cheatah
Hallo Cheatah,
Muss man aber
mit aufpassen, die Methode 'exists' benutzt anscheinend
kein 'equals', um das Vorhanden sein eines Keys zu
pruefen, die Methode 'get' allerdings schon.interessenhalber: In welchem Kontext führt das zu
Problemen?
In jeglichem Kontext, wo nicht ueberprueft werden soll, ob ein
*Objekt* schon in der Hashtable existiert oder ob ein *Key*
schon existiert.
Eigentlich doch nur, wenn der Key "noch komplexer" als ein
String ist, oder?
Auch bei Strings muss die 'equals'-Methode zum Vergleich
angewandt werden.
Gruesse,
CK
Hi,
interessenhalber: In welchem Kontext führt das zu
Problemen?
In jeglichem Kontext, wo nicht ueberprueft werden soll, ob ein
*Objekt* schon in der Hashtable existiert oder ob ein *Key*
schon existiert.
ach so, also am praktischen Beispiel: Wenn in der Hashtable ein Eintrag mit dem Key 'foo' existiert, man die Variable bar=new String('foo') deklariert hat, und man Hash(bar) sucht, richtig? Unkorrekte Schreibweise bitte ich zu entschuldigen, ich bin kein Java-Programmierer :-)
Cheatah
Hallo Cheatah,
ach so, also am praktischen Beispiel: Wenn in der Hashtable
ein Eintrag mit dem Key 'foo' existiert, man die Variable
bar=new String('foo') deklariert hat, und man Hash(bar)
sucht, richtig? Unkorrekte Schreibweise bitte ich zu
entschuldigen, ich bin kein Java-Programmierer :-)
Nee. Das Problem ist, dass Java mit '=' bei etwas anderem als
Basis-Typen auf Objekt-Gleichheit ueberprueft. Das heisst, es
wird geprueft, ob die beiden Variablen auf dasselbe Objekt
verweisen. Und deshalb muss, um Objekte zu verleichen, equals
verwendet werden. Ueberigens: String gehoert *nicht* zu den
Basis-Typen.
Gruesse,
CK
Hallo Christian,
Korrekt waere in der Tat der Ausdruck 'Hashtable'. Und so
heisst auch die Java-Klasse: java.util.Hashtable. Muss man aber
mit aufpassen, die Methode 'exists' benutzt anscheinend kein
'equals', um das Vorhanden sein eines Keys zu pruefen, die
Methode 'get' allerdings schon.
Es gibt keine Methode "exists(...)" in der Klasse Hashtable. Meinst
du vielleicht "containsKey(...)"?
Wenn ja, ist deine Aussage nicht korrekt. Hier ein Auszug aus dem Source
von Hashtable:
public synchronized Object get(Object key) {
Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
return e.value;
}
}
return null;
}
public synchronized boolean containsKey(Object key) {
Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
return true;
}
}
return false;
}
Wie du siehst, ist der Code bis auf den Rückgabewert identisch.
(Was im übrigen ausgesprochen schlechter Programmierstil ist! Aber
darum ging's hier ja nicht...)
Gruß
Slyh
Hallo Slyh,
Es gibt keine Methode "exists(...)" in der Klasse
Hashtable. Meinst du vielleicht "containsKey(...)"?
Habe ich ja bereits verbessert.
Wenn ja, ist deine Aussage nicht korrekt. Hier ein Auszug
aus dem Source von Hashtable:[...]
Wie lang ist das schon so? Ich habe mit dem JDK 1.1.3
arbeiten muessen, da war dem definitiv nicht so.
Gruesse,
CK
Hallo Christian,
Wie lang ist das schon so? Ich habe mit dem JDK 1.1.3
arbeiten muessen, da war dem definitiv nicht so.
So, jetzt habe ich mir extra JDK 1.0.2 runtergeladen. Auch hier
war schon exakt derselbe Code vorhanden, wie auch in der aktuellen
1.4.1. Du mußt dich also täuschen. (Verwechselst du das ganze
vielleicht mit der Klasse HashMap? Naja, wohl nicht. Die gibt's erst
seit 1.2 ...)
Du solltest übrigens solche Aussagen wie "Vorsicht, da ist ein Bug"
schon vorher nochmal überprüfen, wenn du dich auf ein JDK-Version
beziehst, die irgendwann im Frühjahr 1997 rauskam. Das sind immerhin
5 1/2 Jahre an Entwicklung und Bugfixing.
Gruß
Slyh
Hallo Slyh,
So, jetzt habe ich mir extra JDK 1.0.2 runtergeladen. Auch
hier war schon exakt derselbe Code vorhanden, wie auch in
der aktuellen 1.4.1. Du mußt dich also täuschen.
(Verwechselst du das ganze vielleicht mit der Klasse
HashMap? Naja, wohl nicht. Die gibt's erst seit 1.2 ...)
Nein, definitiv nicht. Das ist gerade erst 3 oder 4 Monate
her, ich weiss noch genau, wie ich mich geaergert habe. Und
AFAIK ist das von Lotus Notes verwendete JDK das 1.1.3.
Du solltest übrigens solche Aussagen wie "Vorsicht, da ist
ein Bug" schon vorher nochmal überprüfen, wenn du dich auf
ein JDK-Version beziehst, die irgendwann im Frühjahr 1997
rauskam. Das sind immerhin 5 1/2 Jahre an Entwicklung und
Bugfixing.
Das naechste mal schreibe ich die Version dazu. Aber generell
kann ich dir nicht zustimmen. Besser einmal zuviel vorsichtig
als einmal zuwenig.
Gruesse,
CK