Java-Äquivalent von Perls Hash

8

Ich habe viel Perl-Hashes verwendet, weil es super flexibel und praktisch ist. Zum Beispiel kann ich in Perl Folgendes tun:

%Vor%

Ich frage mich, wie kann ich das gleiche mit Java erreichen, ich denke, es hat etwas mit HashMap zu tun?

Danke,

    
snoofkin 22.01.2011, 16:45
quelle

8 Antworten

18
  

Ich habe viel Perl-Hashes verwendet, weil es super flexibel und praktisch ist. In Perl kann ich zum Beispiel folgendes machen:       %Code%   Ich frage mich, wie kann ich das gleiche mit Java erreichen, ich denke, es hat etwas mit HashMap zu tun?

Der Java-Code, der den folgenden Perl-Code annähert:

%Vor%

ist

%Vor%

Ist das nicht speziell ? :)

Ich sage "approximiert" aus vielen Gründen. Eine davon ist, dass Sie in Java bis zur äußersten Apoplexie frustriert sind, nur weil Sie dann in der nächsten Java-Zeile das Äquivalent dieses vollkommen einfachen Perl-Codes machen wollen:

%Vor%

Wenn Sie Perls Flexibilität und Bequemlichkeit in solchen Dingen wünschen, wird Java Ihnen das einfach nicht geben. Schlimmer noch, seine Anhänger werden dich oft dafür beschimpfen, dass sie solch ein Verlangen ausdrücken.

    
tchrist 22.01.2011, 19:00
quelle
5

Sehen Sie speziell die Karte und deren Implementierungen HashMap .

Achten Sie darauf, dass Java Perls automatische Aktivierung nicht unterstützt (praktisch aber gefährliche Funktion), damit

%Vor%

löst eine Ausnahme aus, wenn z. B. get (phone) null zurückgibt. Beachten Sie auch, dass Sie keine Hashes für Dinge verwenden sollten, die feste Namen haben ("Eigenschaften"), Sie sollten Ihre eigenen Klassen mit ihren Getter und Setter definieren.

    
leonbloy 22.01.2011 16:53
quelle
5

Erstens ist Ihr spezifisches Beispiel ( $hash{AREA_CODE}->{PHONE}->{STREET_ADDR} ), mit hartcodierten Zeichenfolgen als Hash-Schlüssel, nicht wirklich eine nützliche Datenstruktur in Java, wie Michael Carman hervorhob - es sollte als eine Klasse mit Attributen gespeichert werden ( und um ehrlich zu sein, es ist eine schlechte Datenstruktur im Konzept - Daten wie diese sind eher eine Reihe von Telefonen, nicht Hash von Telefonen.

Zweitens, wenn Sie tatsächlich $hash{$AREA_CODE}->{$PHONE}->{$STREET_ADDR} meinten, sieht es so aus, als ob der Java-Code bisher KEINEN generischen äquivalenten Code implementiert hätte - der Code nahm an, dass der Java-Hash zum Beispiel neu initialisiert wurde ODER Mit anderen Worten, wie die Antwort von leonbloy feststellt, fehlt das Merkmal der automatischen Verifizierung.

Die korrekte Autoimplementierung des Code-Mimiks lautet:

%Vor%     
DVK 22.01.2011 20:37
quelle
2

Java hat Hashes, aber wegen der starken Typisierung sind sie nicht so flexibel wie Hashes in Perl. Mehrdimensionale Hashes sind schwieriger zu bearbeiten. In Perl können Sie einfach einen Hash deklarieren und die Autovivi fi zierung die geschachtelten Hashes bei Bedarf erstellen lassen.

%Vor%

In Java müssen Sie es als Hash-of-Hashes deklarieren.

%Vor%

Für jede zusätzliche Dimension müssen Sie der Deklaration eine weitere Verschachtelung von Map<K,V> hinzufügen. Abgesehen davon, dass es langweilig ist, ist das nicht sehr OO.

    
Michael Carman 22.01.2011 18:05
quelle
1

Wenn die Hash-Schlüssel konstant sind, warum wird hash.getAreaCode().getPhone().getStreetAddr() nicht funktionieren? Denken Sie daran, dass entweder Ihre Getter oder Ihre Konstruktoren mit der Generierung von Standardwerten umgehen müssen.

    
Tassos Bassoukos 22.01.2011 18:02
quelle
1

Sie können Ihren Hash einfach ableiten, um eine Methode hinzuzufügen, die für Sie autovivifiziert wird.

Von: $hash{AREA_CODE}->{PHONE}->{STREET_ADDR}

An: hash.vivifyingGet(areaCode).put(phone, streetAddr) .

Angenommen, ich habe den Hash mit erstellt:

%Vor%     
Josh Jore 07.03.2011 01:28
quelle
0

Ich vermisste die Perl-Hashes in meiner Arbeit und machte einige hässliche Workarounds mit Hash-Klassen.

Letzte Woche hatte ich eine Idee, das Ganze in einer PerlMap -Klasse zu implementieren, die Trennzeichen verwendet, um auf Objekte und vor allem die Lists zu Zugriffsteilmengen zuzugreifen.

Es funktioniert gut mit map.get(code:street:phone) und map.put(code:street:phone,"123456789") . Um eine Liste der Telefonnummern zu erhalten, benutzen Sie einfach map.getList(code:street) .

Ich habe gerade angefangen, aber jetzt in meinem Projekt zu verwenden. Es hat keine Einschränkungen der Komplexität :-) und Sie können das Trennzeichen frei wählen. Ich stelle das ganze Zeug unter Ссылка . Habe Spaß.

    
Werner Diwischek 27.02.2012 19:52
quelle
-4

Sie werden wahrscheinlich mit Groovy arbeiten wollen, wenn Sie diese Flexibilität wünschen, aber trotzdem innerhalb der JVM laufen. tchrist ignoriert gerne den Punkt, dass Java im Gegensatz zu dynamisch typisierten Sprachen wie Perl oder PHP stark typisiert ist und mag es auch zu ignorieren, dass Java beim Laufen um eine Größenordnung schneller ist, aber das ist nur ein "Partisan", anscheinend.

    
Nathan Crause 22.01.2011 19:15
quelle

Tags und Links