I’m using this class as my key to Hashmap with overriden hasCode() and equals()
public class Design {
private double[] factors = null;
public double[] getFactors() {
return factors;
}
public void setFactors(double[] factors) {
this.factors = factors;
}
public Design(double[] factors) {
this.factors = factors;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(factors);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Design))
return false;
Design other = (Design) obj;
if (!Arrays.equals(factors, other.factors))
return false;
return true;
}
I added values to map using a loop
public static void main(String[] args) {
Map<Design, Double> map = new HashMap<Design, Double>();
double[] dbl = new double[2];
for(int i=0; i<5; i++){
for(int j=0; j<2; j++){
System.out.println(j+i);
dbl[j] = j+i;
}
Design des = new Design(dbl);
map.put(des, Double.valueOf(i));
}
for(Design d: map.keySet()){
System.out.println(d.getFactors()[0] + "\t" + d.getFactors()[1]);
}
for(double d: map.values()){
System.out.println(d);
}
}
The problem is in the key values. It displayed the last key added.
4.0 5.0
4.0 5.0
4.0 5.0
4.0 5.0
4.0 5.0
Where am I getting wrong?
If you would move the declaration of your array into the
forloop all would go as expected. The problem is now that all yourDesigninstances have the same array.Furthermore, your
equalsmethod will yield to incorrect results when you have a subclass ofDesign. Instead of usinginstanceof, compare the classes. So changeto
This is however unrelated to your problem