Equivalente a Java dei dizionari Python


93

Sono un utente di lunga data di Python e mi piace molto il modo in cui vengono utilizzati i dizionari. Sono molto intuitivi e facili da usare. Esiste un buon Java equivalente ai dizionari di Python? Ho sentito parlare di persone che usano hashmap e hashtable. Qualcuno potrebbe spiegare le somiglianze e le differenze nell'utilizzo di tabelle hash e hashmap rispetto ai dizionari di Python?

Risposte:


106

La dictclasse di Python è un'implementazione di ciò che la documentazione di Python chiama informalmente " tipi di mappatura ". Internamente, dictè implementato utilizzando una tabella hash.

La HashMapclasse di Java è un'implementazione Mapdell'interfaccia. Internamente, HashMapè implementato utilizzando una tabella hash.

Ci sono alcune piccole differenze nella sintassi e credo che le implementazioni siano regolate in modo leggermente diverso, ma nel complesso sono completamente intercambiabili.


40
Nessun esempio fornito :(
Kamran Bigdely,

1
@kami: Che tipo di esempio vorresti?
Daniel Pryden

5
Qualsiasi esempio che illustri un equivalente Java del dizionario di Python in azione. Una risposta utile include qualche esempio perché la maggior parte delle persone viene qui per vedere esempi e li usa nel proprio codice.
Kamran Bigdely

13
@kami: non penso sia giusto. La domanda non chiede "qual è il codice Java equivalente per un codice Python specifico". In effetti la domanda non contiene alcun codice. Non sono sicuro di quale sarebbe il valore dell'aggiunta di esempi di utilizzo dell'API Map in Java; questa risposta si collega già alla documentazione canonica. Se vuoi imparare Java, inizia con un tutorial, non Stack Overflow. Certamente non penso che questa risposta meriti un voto negativo solo perché manca un esempio di codice copia-incollabile.
Daniel Pryden

4
Triste leggere quel commento che dice "la maggior parte delle persone viene qui per vedere esempi e li usa nel proprio codice ", spero che questo sia sbagliato.
0xc0de

31

L'idea di dizionario e mappa è simile. Entrambi contengono elementi come

key1:value1, key2:value2 ... and so on

In Java, Mapvengono implementati diversi modi come HashMap, o TreeMapecc. Le put(), get()operazioni sono simili

import java.util.HashMap;

Map map = new HashMap();
// Put elements to the map
map.put("Ram", new Double(3434.34));
map.put("Krishna", new Double(123.22));
map.put("Hary", new Double(1378.00));
//to get elements
map.get("Krishna"); # =123.22
map.get("Hary"); # = 1378.00 

Vedere la documentazione di HashMap in java8 https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html


5

Per quanto ne so (in realtà non uso java) i dizionari sono solo un altro nome per una hashmap / hashtable.

Prendendo il codice da http://www.fluffycat.com/Java/HashMaps/ sembra che siano usati in un modo molto simile, con un po 'di java boiler-plate in più.


3
Java ha anche un'interfaccia Dictionary che è implementata da Hashtable. HashMap è generalmente preferito, però.
Michael Myers

1
@Michael Myers: Dictionary è deprecato, Oracle consiglia di utilizzare Map invece docs.oracle.com/javase/7/docs/api/java/util/Dictionary.html
Broken_Window

5

Una differenza tra i due è che dictha requisiti più severi per quanto riguarda i tipi di dati che possono fungere da chiave. Java consentirà a qualsiasi oggetto di funzionare come chiave, anche se è necessario fare attenzione a garantire che il hashCode()metodo dell'oggetto restituisca un valore univoco che rifletta il suo stato interno. Python richiede che le chiavi si adattino alla sua definizione di hashable , che specifica che il codice hash dell'oggetto non dovrebbe mai cambiare durante la sua durata.


1
Questo è vero, ma in realtà non è applicato da nessuna delle due lingue. Ovviamente in un hashCode()metodo Java o in un __hash__()metodo Python , dovresti provare a restituire un valore univoco che rifletta lo stato interno. In Java o Python, se hai un oggetto mutabile, probabilmente non dovrebbe essere una chiave con tabella hash, quindi ha senso lanciare un'eccezione dai metodi hashCode()o __hash__().
Daniel Pryden

1
Nella mia esperienza, quasi tutto in Python può essere una chiave dict ... qual è il "requisito più rigoroso"?
Ron Kalian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.