ma attraverso il mappa.put(i1,i1) non aggiungo alla mappa gli oggetti?
se si allora non mi interessa più sapere dei riferimenti (tanto che li riuso)...
Si, aggiungi l'oggetto, ma se non ne istanzi uno nuovo ogni volta, vai a modificare quello che hai inserito nella mappa, alla fine la mappa avra' una sola entry.
Ti faccio vedere. Prima di tutto per snellire il codice metto un costruttore a classmappa.
La parte in fondo alla classe e' invece fondamentale quando si vuole usare una propria classe come chiave di un HashMap.
codice:
public class classmappa {
private int state;
private String message;
public classmappa(int state, String message){
this.state = state;
this.message = message;
}
public void setState ( int state ){
this.state = state;
}
public int getState() {
return this.state;
}
public void setMessage (String message) {
this.message = message;
}
public String getMessage() {
return this.message;
}
//Sovrascrivo questo metodo perche' Map lo usa per il confronto tra key e
//generalmente 2 istanze diverse di un oggetto restituiscono false anche se gli oggetti
//contengono gli stessi valori.
public boolean equals(Object obj) {
classmappa a = (classmappa)obj;
return (a.getState()==this.getState()&&a.getMessage().equals(this.getMessage()));
}
//Sovrascrivo questo oggetto perche' il codice hash e' usato dalle hashmap per
//indicizzare le chiavi e 2 istanze diverse di un oggetto hanno hashCode diversi
//anche se gli oggetti contengono gli stessi valori.
public int hashCode() {
String tmp = state+message;
return tmp.hashCode();
}
}
Il costruttore puoi anche non metterlo, ma almeno usi una riga sola invece di chiamare i due metodi set.
Nell'altra classe
codice:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class provamappa {
static Map mappa = new HashMap();
private static String[] alpha = {"zero", "uno", "due"};
private static int i;
static classmappa i1;
public static void main(String[] args) {
String input = null;
// popolo la mappa
for (i=0; i<3; i++) {
i1 = new classmappa(i, alpha[i]);
//Con la new istanzio un nuovo oggetto ogni volta
mappa.put(i1, i1); // inserisco nella mappa la chiave e il valore
// appena settati
System.out.println(i1.getState()+ " "+i1.getMessage());
// qui stampa a schermo quanto appena inserito, output corretto!!
}
// visualizzazione con input da tastiera: mi stampa quello che scrivo
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
for (i=0; i<3; i++) {
try {
i1 = new classmappa(i, stdIn.readLine());
//Anche stavolta istanzio un nuovo oggetto,
//altrimenti andrei a modificare quello nella map.
} catch (IOException e) {
e.printStackTrace();
}
if (mappa.containsKey(i1)) {
System.out.println("Messaggio: "+i1.getMessage());
} else {
System.out.println("Oggetto non presente");
}
}
}
}
Spero di aver chiarito i tuoi dubbi, ciao.