Пользовательский класс ArrayList в качестве ключа HashMap - PullRequest
0 голосов
/ 21 июля 2011

Я хочу сохранить свои данные в HashMap<Point[], Double>. Я использовал итерацию для назначения данных, но когда я проверил в конце, количество элементов составляет только 1. Я реализовал hashCode() и equals() в пользовательском классе Point.

HashMap<Point[], Double> hmDistOrd = new HashMap<Point[], Double>();
Point[] keyPts = new Point[2];

for (int i=0; i<intersectionPts.size(); i++) {
p1 = intersectionPts.get(i);
    for (int j=0; j<intersectionPts.size(); j++) {
        p2 = intersectionPts.get(j);                
        if (!p1.equals(p2)) {
            keyPts[0] = p1;
            keyPts[1] = p2;
            d = p1.distance(p2);
            hmDistOrd.put(keyPts, d);
        }
    }
}

Есть намеки? Заранее спасибо!

Ответы [ 4 ]

4 голосов
/ 21 июля 2011

Вы не можете использовать массив в качестве ключа, так как массив имеет реализацию по умолчанию hashCode и equals из Objects, и он не учитывает его элементы.

Чтобы это работало, вам пришлось переопределить hashCode и equals массива, но вы не можете это сделать.

Вместо этого вы можете использовать ArrayList, поскольку он реализует hashCode end equals сравнения элементов.

1 голос
/ 21 июля 2011

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

Но установка нового массива для каждого элемента также не будет лучше - тогда у вас будет больше пар ключ-значение, но вы не сможете получить к ним доступ с помощью метода get, если у вас нет правый объект массива (и тогда вы также можете иметь значение), так как массивы не реализуют .equals и hashCode.

Чтобы предложить решение: вы можете использовать List<Point> в качестве типа ключа и использовать новый список для каждой пары ключевых точек. Убедитесь, что вы не изменили список после помещения его в качестве ключа на карту. (Вы можете обернуть его в Collections.unmodifiableList, чтобы убедиться в этом.)

Альтернативой может быть некоторый пользовательский класс парных точек (с собственным hashCode и реализацией equals).

1 голос
/ 21 июля 2011

Вы сохраняете один и тот же экземпляр массива, keyPts, в HashMap на каждой итерации (а также перезаписываете его содержимое).

0 голосов
/ 21 июля 2011

Когда вы используете массив в качестве ключа для хеш-карты, именно метод hashCode этого массива используется для определения хэша ключа, а не вашего класса Point.

В вашем конкретном случае я бы попытался использоватькарта карт: Map<Point, Map<Point, Double>> или пользовательский двумерный матричный класс с 2 ключами и значением.

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