Newsgroup: it.comp.java
Titolo: salvare istanze classi in un hashmap

Salve,
In questo codice d'esempio, salvo diverse istanze della stessa classe
"InfoGiocatore" in un HashMap che ha come chiave il nome del
giocatore. Poi, ad ogni azione fatta, prendo l'istanza dall'HashMap e
la salvo in "elencoAzioni ".
In questo modo, "elencoAzioni" dovrebbe contenere le tre azioni
eseguite dai due giocatori ("bets" fatta da "p1", "raises" fatta da
"p2" e "calls" di "p1"), ma in realtà ottengo un altro risultato: "[p1
calls 350, p2 raise 550, p1 calls 350]". La prima azione di "p1" viene
sostituta dalla sua ultima azione, al posto di "bets" compare
"calls".
Cosa sto sbagliando?
---------------------------------------------------------------------------------------------------------------------------
HashMap<String, InfoGiocatore> gioc = new HashMap<String,
InfoGiocatore>();
LinkedList<InfoGiocatore> elencoAzioni = new
LinkedList<InfoGiocatore>();
gioc.put( "p1", new InfoGiocatore("p1", 1) );
gioc.put( "p2", new InfoGiocatore("p2", 2) );
gioc.get( "p1" ).setAzione("bets");
gioc.get( "p1" ).setPuntata(200);
elencoAzioni .add( gioc.get( "p1" ) );
gioc.get( "p2" ).setAzione("raise");
gioc.get( "p2" ).setPuntata(550);
elencoAzioni .add( gioc.get( "p2" ) );
gioc.get( "p1" ).setAzione("calls");
gioc.get( "p1" ).setPuntata(350);
elencoAzioni .add( gioc.get( "p1" ) );
System.out.println( elencoAzioni );
---------------------------------------------------------------------------------------------------------------------------
grazie anticipatamente per le risposte


Quando inserisci in elencoAzioni, stai inserendo non l'azione ma
l'InfoGiocatore. Per cui quello che inserisci nella lista è p1,p2,p1
(non la stringa, l'istanza, i nomi non li hai dichiarati, è solo un
modo di intendersi).
Quando fai gioc.get( "p1" ).setAzione("calls"); l'istruzione prende
l'istanza p1 e sovrascrive l'azione con calls. Per cui è normale che
quando stampi elencoAzioni, esso tiri fuori p1,p2,p1, ma l'azione di
p1 è stata sovrascritta nell'istanza, per cui è perfettamente normale
che stampi quello che stampa.
2 possibili soluzioni:
1) Usi di fatto una nuova istanza di infogiocatore, per un totale di 3
istanze.
2) Non memorizzi in elencoAzioni l'infogiocatore, ma l'azione. (questo
comporta che LinkedList<String> elencoAzioni = new
LinkedList<String>(); e che
elencoAzioni.add(gioc.get("p1").getAzione());
IMHO il vero problema non è tanto di natura tecnica, ma di natura
semantica: che informazioni dovrebbe contenere InfoGiocatori? Al
momento, da quello che vedo, non memorizzi " l'azione ", ma invece
memorizzi "l'ultima azione". Rinominerei il metodo in get/
setUltimaAzione. Ma quello che forse volevi ottenere è la lista
completa delle azioni. In questo caso, rinominalo in addAzione() e
getAzione(int pos) e sostituisci internamente l'azione con una lista
di azioni (pos sarebbe l'indice dell'azione da recuperare).
Inoltre, un suggerimento: anziché usare una stringa per l'azione,
considera di usare una classe, o almeno un enum.

 considera di usare una classe, o almeno un enum.
Ho usato una stringa perchè è un programmino che devo realizzare in
tempi rapidi - che mi deve trasformare il formato dell'hand history in
un altro -,  e che devo usare per un progetto più complesso...di
conseguenza, la prima cosa che mi è venuta in mente è stata di usare
una stringa. IN questo caso, usando una classe, qualiu vantaggi avrei
potuto avere?
grazie ancora per la risposta