Newsgroup: it.comp.java
Titolo: Chiavi multiple in quale struttura dati ?

Quale struttura dati consente la presenza di chiavi multiple ?
Mi spiego meglio:
se abbiamo
una Map<String, Integer> mappa = new LinkedHashMap<String, Integer>();
e inseriamo la coppia di dati "prima_stringa" ed new Integer(1)
quando poi inseriamo un'altra coppia di dati simili, "prima_stringa"
ed new Integer(-100),
otteniamo la sovrascrizione della prima coppia inserita.
Quale struttura rende possibile la presenza ad entrambe le coppie ?
Grazie

Ho visto un po' in giro per la rete e la soluzione più proposta è
quella di intenedere le coppie come
String, Collection<Integer>
ma questa visione obbliga 2 stringhe omonime a fondere i loro valori
associati, e se le due stringhe rappresentasserro i nomi di due
persone omonime ? Non sarebbe corretto far condividere a queste due
persone diverse i loro valori associati.

 persone diverse i loro valori associati.
non usare come chiave una cosa che chiave non e'

il 18/02/2009 15.38, Scrive Giordano 38534696:

Se le vedessi, allora potrebbe anche essere corretto, ma se ti devi 
basare solo sul nome come potresti fare a distinguerle?
Piuttosto farei una classe, anche semplice che implementi il metodo 
equals() diversamente da String. Il metodo String.equals(Object obj) fa' 
l'override di Object.equals(Object obj) e ritorna true se obj e' un tipo 
String e le stringhe sono uguali, mentre il metodo equals di Object 
ritorna true solo se obj e' la stessa istanza di this. Per cui la tua 
classe potrebbe essere:
public class Persona {
   String nome;
   public Persona(String nome) {
     this.nome = nome;
   }
}
A questo punto la tua mappa diventa:
Map<Persona , Integer> mappa = new LinkedHashMap<Persona , Integer>();
mappa.put(new Persona("Ugo Gagliardelli"), new Integer(1));
mappa.put(new Persona("Ugo Gagliardelli"), new Integer(1));
conterra' due elementi, identici dal punto di vista dei contenuti, ma 
diversi dal punto di vista della collection.
-- 
Dr.Ugo Gagliardelli,Modena,ItalyCertifiedUindoscrasherAñejoAlcoolInside
Spaccamaroni andate a cagare/Spammers not welcome/Spammers vão à merda
Spamers iros a la mierda/Spamers allez vous faire foutre/Spammers loop
schijten/Spammers macht Euch vom Acker/Spamerzy wypierdalac'

uhm... vediamo il mio caso:
LinkedHashMap<NomeStadio, Citta> =
{
 "stadio Olimpico" - "Roma"
,
 "stadio Olimpico" - "Torino"
}
poi ho un file, l'elenco delle squadre, dove è presente solo questa
associazione... NomeSquadra & NomeStadio:
1a squadra) - la società sportva "As Roma" gioca in uno stadio
chiamato "stadio Olimpico"
2a squadra) - la società sportva "Torino" gioca in uno stadio chiamato
"stadio Olimpico"
3a squadra) - la società sportva "Juventus" gioca in uno stadio
chiamato "stadio Olimpico"
etc etc
Vorrei ricavare da NomeSquadra e Nome Stadio
il nome della città...
ma come vedete c'è il rischio che per ("Roma", "stadio Olimpico") vi
risulti che
la squadra capitolina sia -erroneamente- una società sportiva di
Torino.
Voi come fareste ??

il 18/02/2009 17.14, Scrive Giordano 38534696:

Una classe stadio con le due proprieta' nome e citta', una classe 
squadra con le stesse proprieta, un interfaccia luogo ed una classe 
astratta che implementi luogo dalla quale derivano le altre due classi
public interface Luogo extends Comparable {
    public String getCitta();
    public void setCitta(String citta);
}
public abstract class Citta implements Luogo {
   protected String citta;
   public String getCitta() {
     return citta;
   }
   public void setCitta(String citta) {
     this.citta = citta;
   }
   public boolean equals(Object obj) {
     return ((obj != null) &&
	(obj instanceof Citta ) &&
	((Citta )obj).getCitta().equals(this.getCitta());
   }
}
public class NomeSquadra extends Citta {
   String nome;
   public NomeSquadra (String nome, String citta) {
     super(citta);
     this.nome = nome;
   }
}
public class NomeStadio extends Citta {
   String nome;
   public NomeStadio (String nome, String citta) {
     super(citta);
     this.nome = nome;
   }
}
implementi compareTo ed equals per renderli diversi e giochi con il cast 
per verificare se sono uguali


 Quale struttura rende possibile la presenza ad entrambe le coppie ?
Map<String, List<Integer>>
infatti tu non hai bisogno di una struttura dati che consenta 
l'inserimento di multiple coppie chiave-valore, bensì che a una chiave 
corrisponda una lista di valori.
poi, volendo, puoi decorare la struttura con metodi di accesso 
semplificati al tuo scopo.