Ключ объекта Hash Map - PullRequest
       6

Ключ объекта Hash Map

4 голосов
/ 10 января 2012

Я использую этот класс как ключ к Hashmap с переопределенными hasCode () и 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;
}

Я добавил значения для отображения с помощью цикла

 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);
    }
}

проблема в ключевых ценностях.Он отображал последний добавленный ключ.

4.0 5.0
4.0 5.0
4.0 5.0
4.0 5.0
4.0 5.0

Где я ошибаюсь?

Ответы [ 4 ]

3 голосов
/ 10 января 2012

Проблема в том, что вы используете один и тот же массив значений типа double для всех созданных вами экземпляров Design.Когда вы инициализируете следующие числа в основном цикле, вы снова модифицируете первый объект.Попробуйте это:

public double[] getFactors() {
    return factors.clone();
}

public void setFactors(double[] factors) {
    this.factors = factors.clone();
}

public Design(double[] factors) {
    setFactors(factors);
}

Или, если это приведет к снижению производительности, что неприемлемо в вашем приложении, просто будьте очень осторожны с тем, как вы используете массивы, переданные в setFactors, и возвращаемое значение getFactors.

3 голосов
/ 10 января 2012

Вы не копируете свой массив double[] factors в setFactors и конструктор.Вот почему все экземпляры класса ключей в конечном итоге совместно используют один и тот же массив, который вы изменяете в цикле.

Вы должны изменить setFactors следующим образом:

public void setFactors(double[] factors) {
    this.factors = new double[factors];
    System.arrayCopy(factors, 0, this.factors, 0, factors.length);
}

public Design(double[] factors) {
    setFactors(factors);
}
2 голосов
/ 10 января 2012

Если бы вы переместили объявление вашего массива в цикл for, все бы пошло так, как ожидалось.Проблема теперь в том, что все ваши Design экземпляры имеют одинаковый массив.

for(int i=0; i<5; i++){
    double[] dbl = new double[2];
    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));
}

Более того, ваш метод equals даст неверные результаты, если у вас есть подкласс Design.Вместо использования instanceof сравните классы.Так что измените

if (!(obj instanceof Design))
        return false;

на

if (!(obj.getClass() == getClass() ) )
  return false;

Это, однако, не связано с вашей проблемой

2 голосов
/ 10 января 2012

Вы создали только один объект массива. Java использует ссылочную семантику для массивов, поэтому каждый раз, когда вы проходите цикл, вы изменяете значения в массиве, и эти изменения отражаются во всех Design объектах.

Другими словами, у вас есть пять различных Design объектов, и они печатают их все, но все они ссылаются на один и тот же массив.

Чтобы исправить это, создайте новый массив для каждой итерации цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...