Popolare una HashMap in Java
Aug
20098
Il post di oggi si pone l’obbiettivo di presentare un modo semplice ed intuitivo di popolare una HashMap in Java.
Premesso che per “Tabella di Hashing” si intende una struttura dati di tipo associativo in cui c’è un associazione univoca tra chiave e relativo valore. Per poter accedere un certo valore bisogna conoscerne la relativa chiave. Senza entrare troppo nei dettagli teorici, l’uso di tabelle di hashing risulata conveniente in caso di operazione di ricerca, dato che il tempo di ricerca di una qualunque chiave all’interno della tabella è costante ( in termini matematici è un O(1) ).
Java mette a disposizione del programmatore una classe che implementa le funzionalità di una tabella di hashing tramite la classe “HashMap”. Di seguito ho realizzato una classe che illustri l’utilizzo delle “Map” :
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class HashMapTest {
private HashMap map ;
public HashMapTest() {
map = new HashMap();
}
public HashMap setMap() {
String nome = "Andrea";
String anno = "2009";
map.put("k1", nome);
map.put("k2", anno);
return map ;
}
public void printMapContent(HashMap m) {
Set set= m.keySet() ;
Iterator iter = set.iterator () ;
while ( iter.hasNext () ) {
System.out.println ( m.get ( iter.next () ) ) ;
}
}
public static void main (String args[]){
HashMapTest test = new HashMapTest();
HashMap resMap = test.setMap();
test.printMapContent(resMap);
}
}// :~
Osservando il codice si nota come una volta creato l’oggetto “map” , istanza della classe HashMap , ci siano due metodi che vengono richiamati , “put()” e “get()” rispettavamente per inserire una nuova entry nella tabella e l’ altro per ottenere il valore della entry selezionata a partire dalla chiave inserita.
Il metodo “setMap” realizza il riempimento della struttura dati tramite il metodo put() e ritorna un riferimento alla tabella appena aggiornata. In particolare la chiamata di put() avviene in questo modo: put( “NOME_CHIAVE” , “VALORE ASSOCIATO”), dove entrambi i parametri di ingresso sono di tipo String.
Il riferimento ottenuto da setMap() , viene poi utilizzato dal metodo printMapContent() per stampare a video il contenuto della tabella. In questo metodo viene richiamata la funzione “get” che prende come parametro di ingresso una stringa che rappresenta il nome della chiave della entry ricercata e ritorna il valore associato quindi la chiamata avviene come segue: get( “NOME_CHIAVE”).
Entrambi i metodi realizzati, vengono utilizzati nel metodo main() della classe. Provando ad eseguire il codice, il risultato desiderato sarà:
Andrea 2009
Al prossimo post!











March 22nd, 2011 on 08:26
non capisco a cosa serva passare il parametro HashMap m.
public void printMapContent(HashMap m) {
Set set= map.keySet() ;
Iterator iter = set.iterator () ;
while ( iter.hasNext () ) {
System.out.println ( map.get ( iter.next () ) ) ;
}
}
Comunque grazie per l’articolo
April 1st, 2011 on 08:50
@Danilo: In realtà c’era un errore di battitura che ho risolto. Nella printMapContent, “map” era in realtà il parametro “m” di ingresso.
May 17th, 2011 on 17:55
Ciao… post interessante ma ho una domanda:
quando memorizzo più oggetti in una hashmap quando li vado a prelevare in che ordine vengono risvegliati? In ordine casuale o viene seguito l’ordine di memorizzazione?
May 17th, 2011 on 19:00
@Ale:
Ti ringrazio per il complimento, cmq l’ ordine di prelievo del “valore” presente nell’ hashmap dipende dal valore della “chiave” utilizzato. L’ ordine lo scegli tu in base alla chiave passata al metodo get(). Si tratta di un tipo di accesso diretto e non sequenziale.
May 18th, 2011 on 17:38
Ho provato a costruire una struttura simile per un progetto di esame che sto facendo, funziona tutto bene tranne un piccolo problema: nella mia hash table sono presenti più oggetti e quando li vado a prelevare non me li restituisce nell’ordine in cui li ho inseriti…. forse ho sbagliato qualcosa nella politica di risveglio… è possibile?
May 18th, 2011 on 19:08
@Ale:
posta un pò di codice in modo che sia + chiaro il tuo problema
May 18th, 2011 on 19:53
Sto lavorando con la seguente hashmap nella quale andrò ad inserire dei threads:
HashMap coda;
Le seguenti due righe le utilizzo per inserire i threads nella mia hashmap e per sospenderli in una variabile condizionale all’interno della hashmap stessa:
this.coda.put(c, this.accessoVar.newCondition());
this.coda.get(c).await();
I threads devono poi essere risvegliati nell’ordine in cui sono stati inseriti nella hashmap e utilizzo le seguenti righe di codice:
Set tmpClienti = this.coda.keySet();
Iterator c = tmpClienti.iterator();
Cliente selezionata = c.next();
Tutto bene ma ho un problema: i threads non vengono sempre risvegliati nell’ordine in cui sono stati inseriti…
May 18th, 2011 on 19:58
Non mi ha preso alcuni termini tra virgolette…. dopo HashMap ci va “Cliente, Condition” e dopo Iterator ci va “Cliente”.