Java odpowiednik słowników Pythona

94

Jestem użytkownikiem Pythona od dawna i bardzo podoba mi się sposób, w jaki używane są słowniki. Są bardzo intuicyjne i łatwe w użyciu. Czy istnieje dobry odpowiednik w Javie dla słowników Pythona? Słyszałem o ludziach używających hashmaps i hashtables. Czy ktoś mógłby wyjaśnić podobieństwa i różnice między używaniem tablic mieszających i tablic mieszających w porównaniu ze słownikami Pythona?

slimbo
źródło

Odpowiedzi:

107

dictKlasa Pythona jest implementacją tego, co dokumentacja Pythona nieformalnie nazywa „ typami odwzorowania ”. Wewnętrznie dictjest realizowane za pomocą tablicy haszującej.

HashMapKlasa Javy to implementacja Mapinterfejsu. Wewnętrznie HashMapjest realizowane za pomocą tablicy haszującej.

Istnieje kilka drobnych różnic w składni i uważam, że implementacje są nieco inaczej dostrojone, ale ogólnie są całkowicie wymienne.

Daniel Pryden
źródło
42
Nie podano przykładu :(
Kamran Bigdely
1
@kami: Jaki przykład chcesz?
Daniel Pryden,
5
Dowolny przykład ilustrujący działanie słownika języka Python w Javie. Przydatna odpowiedź zawiera przykład, ponieważ większość ludzi przychodzi tutaj, aby zobaczyć przykłady i użyć ich w swoim kodzie.
Kamran Bigdely,
14
@kami: Myślę, że to nie w porządku. Pytanie nie dotyczy tego, „jaki jest odpowiednik kodu Java dla określonego kodu w Pythonie”. W rzeczywistości pytanie w ogóle nie zawiera żadnego kodu. Nie jestem pewien, jaka byłaby wartość dodania przykładów użycia interfejsu API Map w Javie; ta odpowiedź już prowadzi do dokumentacji kanonicznej. Jeśli chcesz nauczyć się języka Java, zacznij od samouczka, a nie od Stack Overflow. Z pewnością nie sądzę, aby ta odpowiedź uzasadniała negatywną opinię tylko dlatego, że brakuje w niej przykładowego kodu do skopiowania.
Daniel Pryden,
4
Szkoda, że ​​czytam ten komentarz mówiący, że „większość ludzi przychodzi tutaj, aby zobaczyć przykłady i użyć ich w swoim kodzie ”, mam nadzieję, że to jest złe.
0xc0de
31

Idea słownika i mapy jest podobna. Oba zawierają elementy takie jak

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

W Javie Mapzaimplementowano różne sposoby, takie jak HashMap, TreeMapitp. put(), get()Operacje są podobne

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 

Zobacz dokumentację HashMap w java8 https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

Hary Bakta
źródło
5

O ile mi wiadomo (właściwie nie używam javy), słowniki to po prostu inna nazwa dla hashmap / hashtable.

Pobieram kod z http://www.fluffycat.com/Java/HashMaps/ wydaje się, że są one używane w bardzo podobny sposób, z odrobiną dodatkowej gotowej płyty java.

Tabitha
źródło
3
Java ma nawet interfejs Dictionary, który jest implementowany przez Hashtable. Generalnie preferowana jest jednak HashMap.
Michael Myers
1
@Michael Myers: Słownik jest przestarzały, Oracle zaleca zamiast tego używać Map docs.oracle.com/javase/7/docs/api/java/util/Dictionary.html
Broken_Window
5

Jedna różnica między nimi polega na tym, że dictistnieją bardziej rygorystyczne wymagania dotyczące typów danych, które mogą pełnić rolę klucza. Java pozwoli dowolnemu obiektowi działać jako klucz - chociaż należy zadbać o to, aby hashCode()metoda obiektu zwracała unikalną wartość, która odzwierciedla jego stan wewnętrzny. Python wymaga, aby klucze pasowały do ​​jego definicji hashable , która określa, że ​​kod skrótu obiektu nigdy nie powinien się zmieniać w czasie jego życia.

Tim Clemons
źródło
1
To prawda, ale w rzeczywistości nie jest to wymuszane przez żaden z języków. Oczywiście w hashCode()metodzie Javy lub w __hash__()metodzie Pythona należy spróbować zwrócić unikalną wartość, która odzwierciedla stan wewnętrzny. W Javie lub Pythonie, jeśli masz zmienny obiekt, prawdopodobnie nie powinien to być klucz z możliwością skrótu, więc sensowne jest zgłoszenie wyjątku od metod hashCode()lub __hash__().
Daniel Pryden
1
Z mojego doświadczenia wynika, że ​​prawie wszystko w Pythonie może być kluczem do dyktowania ... jakie są „surowsze wymagania”?
Ron Kalian,