2016-10-30 5 views
0

У меня есть 100 записей, и я должен иметь их в хэш-таблицу ограниченного размера.Как сделать ключ имеет несколько значений в Hashtable?

Я знаю, как работать с первым входом, ht.put(k,v) делает трюк.

Но как только я хочу добавить к нему еще одно значение, старый будет перезаписан. Я не хочу этого делать, я хочу добавить его в связанном списке или в arraylist.

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?

+0

@NickBell Это другое. –

+0

Что бы вы хотели 'ht.get (1)' вернуться? – njzk2

+0

как 40, так и 60. –

ответ

0

Вы используете тот же ключ (1), который вам не нужен, если вы не хотите добавлять больше значений к одному и тому же ключу, в этом случае есть хеш-таблица из списка массивов HashMap<Integer,List<Integer>> integerArrayMap.

В Hashtable ключ ДОЛЖЕН быть уникальным, так как вы НЕ используете уникальные ключи, то же значение заменяется. поэтому постарайтесь установить значения с помощью разных клавиш.

ht.put(1, 40); 
ht.put (2, 60); 

Я предлагаю вам обратиться к Hashtable апи здесь: https://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html

1

Вы должны линейные зондирующий http://www.sanfoundry.com/java-program-implement-hash-tables-linear-probing/

Это не позволяет хранить более одного значения в ячейке хэш-таблицы

При попытке сопоставить новый ключ с уже занятой ячейкой это называется столкновением.

Есть несколько схем алгоритма, чтобы попытаться и работа вокруг столкновения, один линейное зондирование - который находит следующий наиболее подходящее свободное место для ключа для хранения

2

Вы можете иметь список, как тип значения, как:

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); 
} 

[Update1] Если вы хотите, вы можете сделать свой один расширение Ha shtable как:

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); 
    } 
} 
+0

Это означает, что я переопределяю метод put hashtable правильно? @rsutormin –

+1

Начиная с Java 8, вы можете сделать это в одной строке: 'hashTable.computeIfAbsent (key, k -> new ArrayList ()). add (value);' Фактически, [документация] (https: //docs.oracle.com/javase/8/docs/api/java/util/Map.html#computeIfAbsent-K-java.util.function.Function-) имеет пример именно этого варианта использования. – VGR

+0

@MayurTolani: ответила вам в [UPDATE1] в моем основном ответе. – rsutormin

1

Структура данных вы ищете называется Мульти Карта. По определению он имеет другой интерфейс, чем карта, поскольку он позволяет использовать несколько значений, связанных с одним и тем же ключом.

Нет никакой стандартной реализации библиотеки для этой структуры данных. Но вы можете найти хорошие в некоторых библиотеках с открытым исходным кодом: