Коллекции - длинный хэш-код класса против целого хэш-кода класса - PullRequest
0 голосов
/ 02 декабря 2018

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

static int numberOfPairs(int[] a, long k) {
                Integer
        Map<Integer,Integer> map = new HashMap<>();
        int count =0;
        for(int i=0;i<a.length;i++){
            for(int j=i+1;j<a.length;j++) {
                if(a[i]+a[j] == k){
                    if((!map.containsKey(a[i])) && (!map.containsKey(k-a[i]))) {
                        map.put(a[i], a[j]);
                        count++;
                    }
                }
            }
        }
        return count;
    }

метод содержит ключ не работает для приведенного выше кода. Bcoz k имеет тип long. Но код работает, если я преобразую long в int.

static int numberOfPairs(int[] a, long k) {
                Integer
        Map<Integer,Integer> map = new HashMap<>();
        int count =0;
        for(int i=0;i<a.length;i++){
            for(int j=i+1;j<a.length;j++) {
                if(a[i]+a[j] == k){
                    int x=(int)k-a[i];
                    if((!map.containsKey(a[i])) && (!map.containsKey(x))) {
                        map.put(a[i], a[j]);
                        count++;
                    }
                }
            }
        }
        return count;
    }

Que: почему этого не произошлоработать с длинным типом? как работает метод containsKey?

1 Ответ

0 голосов
/ 02 декабря 2018

map.containsKey (ka [i])

Проверка наличия Long в Map<Integer, Integer>.Это всегда будет ложью, даже если числовое значение будет одинаковым.

Обратите внимание, что long необходимо использовать в качестве аргумента для containsKey(Object key), но он будет автоматически упакованна Long, а не Integer.

Статическая проверка кода, такая как Findbugs, может предупредить вас об этом.Если бы дженерики попали в Java раньше, это, вероятно, было бы даже ошибкой во время компиляции, которую вы хотели бы здесь.

map.containsKey ((int) (ka[i]))

Теперь у вас есть int, который будет автоматически упакован в Integer, и он работает.

...