antomau96 ha scritto:
E se utilizzassi un oggetto Comparable tipizzato? Ad esempio Comparable<MyWarehouse> ? Sarebbe sbagliato anche in quel caso?
Comparable non c'entra nulla (e non ha alcun coinvolgimento) con HashMap. Al massimo ha a che fare con TreeMap. Ma HashMap e TreeMap sono due collezioni "mappe" con caratteristiche e soprattutto "prestazioni" ben differenti.
Se usare una o l'altra dipende da vari fattori, che presumo non hai ancora approfondito.
antomau96 ha scritto:
Scusa ma posso sapere perché intendi che funziona per puro caso?
Perché il codice hash per calcolare la posizione dell'oggetto viene ottenuto per puro caso?
Per "caso" nel senso che ti spiegherò ora.
Se non si ridefiniscono equals/hashCode, restano quelli "ereditati" da Object, che si basano solo sulla IDENTITÀ degli oggetti. Se in HashMap metti come chiavi oggetti che hanno equals/hashCode di Object, il valore associato alla chiave lo puoi ritrovare con get() solo e ripeto SOLO se hai in mano esattamente quel medesimo oggetto che avevi usato per il put().
import java.util.HashMap;
public class Prova {
public static void main(String[] args) {
HashMap<Persona,String> map = new HashMap<Persona,String>();
Persona p1 = new Persona("Mario", "Rossi");
map.put(p1, "studente");
System.out.println(map.get(p1)); // Stampa: studente (ritrova la chiave nella map)
Persona p2 = new Persona("Mario", "Rossi");
System.out.println(map.get(p2)); // Stampa: null (NON ritrova la chiave nella map)
}
}
class Persona {
private String nome;
private String cognome;
public Persona(String nome, String cognome) {
this.nome = nome;
this.cognome = cognome;
}
public String getNome() {
return nome;
}
public String getCognome() {
return cognome;
}
}
Osserva bene il codice. p1 è usato sia per il put che per il primo get. Visto che l'oggetto è sempre quello, allora FUNZIONA. Quando fai il primo get, siccome hai in mano lo stesso oggetto "chiave" che c'è già dentro la map, allora si riesce ad ottenere il valore "studente".
Poi creo un nuovo oggetto Persona che, guarda caso, ha lo stesso contenuto di p1. Ma il get con p2 NON funziona. Non avendo più quello stesso oggetto che c'è dentro la map, non si riesce a rintracciare la chiave e quindi nemmeno il valore. Anche se i due oggetti p1 e p2 hanno lo stesso contenuto.
E tutto questo succede NON perché c'è qualcosa di sbagliato nella implementazione di HashMap ma perché la classe Persona NON ha ridefinito equals/hashCode e quindi resta il principio di uguaglianza che si basa SOLO sulla "identità" degli oggetti.
Ed è questo che NON VA BENE in generale. Ci possono essere degli scenari in cui serve la mappatura delle chiavi per "identità" degli oggetti ma sono scenari ultra-particolari.
antomau96 ha scritto:
ottengo il keyset della mappa generale
dalla chiave (mappa<mappa prec., int>) ottengo il numero di prodotti,
poi ottengo il keyset della chiave (mappa interna)
dalla quale vado a prendere il magazzino (chiave della mappa interna)
e il prodotto (valore della mappa interna)....
Se fai una iterazione sulle chiavi, ovviamente ottieni esattamente quegli oggetti che fanno da chiave e quindi se fai un get ovviamente FUNZIONA, pur basandosi sulla identità degli oggetti.
Idem se per caso ti sei tenuto delle chiavi memorizzate da qualche parte (altra collezione, altre variabili). Finché fai così, "per caso" ti funziona, pur senza ridefinire equals/hashCode.
Ma attenzione: NON è questo il modo giusto di ragionare con le mappe basate su hash-table interna (HashMap, Hashtable)
Tutto questo ti è chiaro? Se sì, puoi andare (un po') avanti. Se no, è bene che (ri)studi un pochino.