Hashtable с массивом int в качестве ключа в Java - PullRequest
7 голосов
/ 08 января 2011

Я пытаюсь создать хеш-таблицу в Java, где ключи int [], но это не работает. Я сделал небольшую тестовую программу, чтобы показать мою проблему:

public class test{
        public static void main(String[] args){
                int[] test0 = {1,1};
                int[] test1 = {1,1};
                Hashtable<int[], String> ht = new Hashtable<int[], String>();
                String s0 = "foo";

                ht.put(test0, s0);

                System.out.println("the result from ht.get(test1)");
                System.out.println(ht.get(test1));
                System.out.println("the result from ht.get(test0)");
                System.out.println(ht.get(test0));
        }
}

Я предполагаю, что оба вызова ht.get должны возвращать один и тот же результат, так как два массива равны, но они не совпадают. Вот результат выполнения кода:

the result from ht.get(test1)
null
the result from ht.get(test0)
foo

Я что-то здесь упускаю или просто невозможно использовать int [] в качестве ключей в hastable?

Ответы [ 3 ]

16 голосов
/ 08 января 2011

Вы можете использовать int [] в качестве ключа, но это должен быть один и тот же массив, а не только один и тот же контент. (Что означает, что он не будет делать то, что вы хотите)

Массивы не равны () или не имеют одинаковый hashCode () в зависимости от их содержимого, если они являются одним и тем же массивом.

Единственный способ сделать это - использовать List в качестве ключа или оболочки для вашего int [], например. TIntArrayList.

попробуйте следующее.

List<Integer> test0 = Arrays.asList(1,1);
List<Integer> test1 = Arrays.asList(1,1);
Map<List<Integer>, String> ht = new HashMap<List<Integer>, String>();

Кстати: Hashtable - это устаревший класс ИМХО, не используйте его, если нет необходимости.

0 голосов
/ 08 января 2011

Основная причина - массив test0 и test1 имеют различных хэш-кодов . Если 2 ключа имеют разные хеш-коды, они никогда не могут быть одинаковыми.

0 голосов
/ 08 января 2011

Вы можете создавать строки из массивов перед хэшированием (если длина массива непомерно велика) в дополнение к переносу в список

Если вы выберете последнее, то есть статический метод Arrays описано здесь Из java-статического класса Arrays в http://download.oracle.com/javase/1.5.0/docs/api/java/util/Arrays.html#toString(int[])

h1.put(Arrays.toString(test1), s0);

Теперь вы можете хэшировать это, и эквивалентные массивы будут хэшировать то же самое.Однако вы не сможете воссоздать массив по ключу (если только у Java сейчас не будет eval?)

.
.
.
.

Ради любопытства, я тупо катаюсь, пока не нашел вышеописанный метод:

public String intArrayToString(int[] x)
{
     String ans = '[';
     for(i = 0; i < size(x); i++)
         ans += '' + i + ',';
     return ans + ']';
}

HashTable<String,String> h1 = new HashTable<String,String> h1;
h1.put(intArrayToString(test1), s0);

Если есть какая-то статическая toString, которая делает это, я прошу прощения.PS - есть ли в Java функции сокращения (и лямбды), циклы foreach или eval (для преобразования ключей в массив, если это необходимо)?Они бы сделали это решение лучше ...

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