muenzchen: Assoziatives Array in Java?

Hallo!

Und noch eine Javafrage :)

Wie sieht ein assoziatives Array in Java aus? Gobts das überhaupt? Ich konnte nirgendwo etwas darüber finden.

  1. 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

    --
    X-Will-Answer-Email: No
    1. 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.

      1. 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

        1. 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.

    2. 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

      1. 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

        1. 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

          1. 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

      2. 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

        --
        X-Will-Answer-Email: No
        1. 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

          1. 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

            --
            X-Will-Answer-Email: No
            1. 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

      3. 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

        --
        Es gibt nur 10 Arten von Menschen. Solche, die das Binärsystem verstehen, und solche, die es nicht verstehen.
        1. 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

          1. 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

            --
            Es gibt nur 10 Arten von Menschen. Solche, die das Binärsystem verstehen, und solche, die es nicht verstehen.
            1. 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