Как сделать так, чтобы ключ имел несколько значений в Hashtable?
У меня есть 100 записей, и я должен хэшировать их в хеш-таблицу ограниченного размера.
Я знаю, как работать с первой записью, ht.put(k,v)
делает трюк.
Но как только я хочу добавить еще одно значение, старый перезаписывается. Я не хочу этого делать, я хочу добавить его в связанный список или список авторов.
Hashtable<Integer,Integer> ht = new Hashtable<Integer,Integer>(211);
ht.put(1, 40);
ht.put (1, 60);
System.out.println(ht.get(1));
// output is 60
Как сделать это как 40, так и 60?
5 ответов
Вы можете иметь список в качестве типа значения, например:
Hashtable<Integer,List<Integer>> ht = new Hashtable<Integer,List<Integer>>(211);
И ваша пут-операция будет выглядеть так:
public static void put(Hashtable<Integer,List<Integer>> ht, int key, int value) {
List<Integer> list = ht.get(key);
if (list == null) {
list = new ArrayList<Integer>();
ht.put(key, list);
}
list.add(value);
}
[ОБНОВЛЕНИЕ1] Если вы хотите, вы можете сделать одно расширение Hashtable следующим образом:
public class MyHashtable extends Hashtable<Integer,List<Integer>> {
public MyHashtable(...) { // add params if needed
super(...);
}
// with additional method:
public static void putOne(int key, int value) {
List<Integer> list = this.get(key);
if (list == null) {
list = new ArrayList<Integer>();
this.put(key, list);
}
list.add(value);
}
}
Вам нужно линейное зондирование http://www.sanfoundry.com/java-program-implement-hash-tables-linear-probing/
Невозможно сохранить более одного значения в ячейке хеш-таблицы
При попытке сопоставить новый ключ с уже занятой ячейкой это называется столкновением.
Существует несколько схем алгоритмов, позволяющих обойти коллизии, одна из которых - Линейное зондирование, которое находит следующее наиболее подходящее свободное пространство для хранения ключа.
Структура данных, которую вы ищете, называется Multi Map. По определению он имеет интерфейс, отличный от карты, поскольку допускает несколько значений, связанных с одним и тем же ключом.
Для этой структуры данных пока нет стандартной реализации библиотеки. Но вы можете найти хорошие в некоторых библиотеках с открытым исходным кодом:
Вы используете тот же ключ (1), который не тот, который вы хотели, если только вы не хотите добавить больше значений к тому же ключу, в этом случае есть хэш-таблица списка массивов HashMap<Integer,List<Integer>> integerArrayMap
,
В Hashtable ключ ДОЛЖЕН быть уникальным, так как вы НЕ используете уникальные ключи, заменяется одно и то же значение. поэтому попробуйте поставить значения с разными ключами.
ht.put(1, 40);
ht.put (2, 60);
Я предлагаю вам обратиться к API Hashtable здесь: https://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html
Multimap ( https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/Multimap.html) должен помочь, если вам разрешено его использовать.
В качестве альтернативы, вы можете использовать Map<Integer, List<Integer>>
,