Почему содержит ключ, не нашел ключ? - PullRequest
1 голос
/ 10 декабря 2010

У меня есть следующий код:

payoffs2exchanges.put(point, exchange);
if (!payoffs2exchanges.containsKey(point) ) {
   game.log.fine("yes");
} else {
   game.log.fine("no");
}

Выводит «нет». Другими словами, я добавляю пару ключ-значение на карту, а затем сразу после этого проверяю, существует ли ключ, и выясняю, что он не существует. Зачем?

У меня все еще есть проблема с ключом. Следующий код говорит, что каждый раз, когда я добавляю ключ, я добавляю новый ключ. И я знаю, что это не так.

        Integer[] point = new Integer[2];
        point[0] = proposerBestScore;
        point[1] = responderBestScore;
        game.log.fine("In the getCloudOfPayoffs: found payoffs:" + point[0] + "," + point[1] + ". Exchange: " + exchange[0]+","+exchange[1]+","+exchange[2]+","+exchange[3]+","+exchange[4]);
        // With the following block we ensure that every options (pair of payoffs) is represented by exchange with minimal number of moves.
        if (!payoffs2exchanges.containsKey(point)) {
            payoffs2exchanges.put(point, exchange); 
            game.log.fine("In the getCloudOfPayoffs: this option is new. We add it to the map.");
        } else {
            game.log.fine("In the getCloudOfPayoffs: this option is old.");
            Integer[] exchangeFromMap = payoffs2exchanges.get(point);
            Integer newSum = 0;
            Integer oldSum = 0;
            for (int i=0;i<Design.nColors;i++) {
                newSum = newSum + Math.abs(exchange[i]);
                oldSum = oldSum + Math.abs(exchangeFromMap[i]);
            }
            if (newSum<oldSum) {
                game.log.fine("In the getCloudOfPayoffs: the new exchange is better than the old one.");
                payoffs2exchanges.put(point, exchange);
            }
        }

Ответы [ 3 ]

6 голосов
/ 10 декабря 2010

Вы используете Integer[] в качестве ключа на карте.Это плохо, поскольку Java-массивы не реализуют equals и hashCode, как вы могли бы ожидать. См. Этот пример:

public class Test {
    public static void main(String[] args) {
        Integer[] arr1 = { 1, 2 };
        Integer[] arr2 = { 1, 2 };

        System.out.println(arr1.equals(arr2));
        System.out.println(arr1.hashCode() + " / " + arr2.hashCode());
    }
}

На моем компьютере он печатает:

false
1476323068 / 535746438

Я рекомендую создать пользовательский класс Point, который корректно переопределяет equals и hashCode (или, возможно, повторно использует java.awt.Point, если вы считаете, что это имеет смысл).

6 голосов
/ 10 декабря 2010

Это делает правильные вещи. containsKey возвращает true, оператор ! отрицает его до false и выводит no (предложение else).

0 голосов
/ 10 декабря 2010

Посмотрите на ваш код :) он печатает no, если на самом деле карта содержит ключ ...

...