PDA

View Full Version : [Java] Hash Set


stregone_giallo_rosso
20-09-2007, 22:53
Salve qualkuno puo farmi una panoramica sulla classe HAsh Set e su come si utilizza???

andbin
21-09-2007, 08:22
Salve qualkuno puo farmi una panoramica sulla classe HAsh Set e su come si utilizza???Un HashSet:
- è un 'Set', pertanto non ci possono essere elementi duplicati.
- è basato internamente su una hash-table (per essere precisi usa un HashMap), quindi gli oggetti contenuti devono fornire una implementazione corretta di equals() e hashCode().
- è una collezione unsorted/unordered, in sostanza non esiste un ordine specifico né all'interno della collezione né per la iterazione.
- permette di inserire un elemento null.
- è una implementazione non synchronized.
- l'iteratore fornito è di tipo "fail-fast".

stregone_giallo_rosso
22-09-2007, 12:19
Qualche esempio??

stregone_giallo_rosso
24-09-2007, 14:02
Up

andbin
25-09-2007, 08:08
Qualche esempio??HashSet<String> s = new HashSet<String> ();
s.add ("ciao");
s.add ("prova");

Bouba_Diop
20-10-2007, 19:09
ciao a tutti.

sto utilizzando un hashset in java, il mio problema è che vorrei che estraesse gli oggetti contenuti in modo moooolto più random. Capita tantissime volte che estragga elementi dello stesso tipo uno di fila all'altro. Es: Immaginate che ci siano i numeri da 1 a 10 e quando estraggo l'intero hashset in pratica mi estrae tipo: 1-6-2-3-4-9-7-8-5-10 (questo esempio è anche ottimista :D)

La domanda quindi è: esiste un modo per randomizzare ancora di più la natura "random" delle estrazioni di un hashset?

grazie ciao!

andbin
21-10-2007, 09:40
sto utilizzando un hashset in java, il mio problema è che vorrei che estraesse gli oggetti contenuti in modo moooolto più random. Capita tantissime volte che estragga elementi dello stesso tipo uno di fila all'altro. Es: Immaginate che ci siano i numeri da 1 a 10 e quando estraggo l'intero hashset in pratica mi estrae tipo: 1-6-2-3-4-9-7-8-5-10 (questo esempio è anche ottimista :D)

La domanda quindi è: esiste un modo per randomizzare ancora di più la natura "random" delle estrazioni di un hashset?Come ho detto nel mio post sopra, HashSet è una collezione unsorted/unordered. Vuol dire che non c'è un ordine preciso nella iterazione degli elementi.

Un ordine però è ovvio che esiste (da qualche parte deve iniziare a iterare per poi finire ad un certo punto...) ma dipende da diversi fattori come la dimensione della lista dei "bucket" interna e il valore ritornato da hashCode() degli oggetti contenuti nella collezione.
Se fai un HashSet di interi (HashSet<Integer>) il valore fornito da hashCode() è proprio direttamente il valore dell'intero. Se hai un intero 0, è quasi sicuro che vada a finire nel "bucket" 0 e se hai un intero 1 è altrettanto quasi sicuro che vada a finire nel "bucket" 1 ecc.... ma potrebbe capitare che lista dei bucket è corta (es. 31 bucket) e quindi il valore intero 40 vada a finire nel bucket es. 9.

Insomma, con gli interi va così ma solo perché hashCode() fornisce lo stesso valore dell'intero (e non potrebbe essere più semplice di così....). Con le stringhe sarebbe ancora diverso, perché l'hashcode è calcolato in maniera più complessa.

Quindi per rispondere alla tua domanda: no, un HashSet non è una collezione da cui poter pretendere/ottenere un qualche ordine di iterazione specifico e nemmeno "casuale". Se vuoi "mescolare" i valori, allora da un HashSet cerca di ottenere una List e poi usa il metodo Collections.shuffle.

Scritto con del codice, per esempio:

HashSet<Integer> set = new HashSet<Integer> ();

//.... inserimenti ....

ArrayList<Integer> list = new ArrayList<Integer> (set);
Collections.shuffle (list);

// ora list ha tutti i valori mescolati
Quello che purtroppo deduco dalla tua domanda è che non ti è chiaro come funzionano internamente HashMap/HashSet.

Bouba_Diop
21-10-2007, 20:17
Spero di non averti turbato più di tanto con la mia infinita ignoranza.... si vede che sei molto bravo a programmare. Ti ringrazio quindi per il tuo aiuto.

Una diversa soluzione potrebbe anche essere quella di cambiare l'hashset dei miei oggetti. Insernedo quindi un numero random da 0 a 2 miliardi come hashset, dovrei ottenere ciò che desidero giusto?

ciao grazie

stregone_giallo_rosso
08-09-2008, 23:21
Salve mentre le HashMAp possono essere ordinate??

banryu79
09-09-2008, 08:23
Salve mentre le HashMAp possono essere ordinate??
Qui (http://www.codeguru.com/forum/archive/index.php/t-284510.html)c'è un'interessante (vecchio) thread al riguardo.

andbin
09-09-2008, 08:35
Salve mentre le HashMAp possono essere ordinate??No.

Piccolo riassunto per le principali implementazioni di Set e Map (ne esistono altre, si veda javadoc):

HashSet/HashMap/Hashtable sono: unsorted e unordered
TreeSet/TreeMap sono: sorted (quindi anche ordered)
LinkedHashSet/LinkedHashMap sono: unsorted ma ordered

ordered = l'ordine di iterazione è prevedibile (non "casuale" o comunque stabilito da fattori legati alla implementazione interna).

sorted = la collezione è mantenuta ordinata internamente in base al contenuto degli oggetti.