Как создать хеш-таблицу в Java? - PullRequest
9 голосов
/ 27 августа 2008

Какой самый простой способ создания хеш-таблицы (или ассоциативного массива ...) в Java? Мой гугл-фу нашел пару примеров, но есть ли стандартный способ сделать это?

И есть ли способ заполнить таблицу списком пар ключ -> значение без отдельного вызова метода add для объекта для каждой пары?

Ответы [ 8 ]

25 голосов
/ 27 августа 2008
Map map = new HashMap();
Hashtable ht = new Hashtable();

Оба класса можно найти в пакете java.util. Разница между двумя значениями объясняется в следующей записи jGuru FAQ .

22 голосов
/ 28 августа 2008

Вы можете использовать двойные скобки для настройки данных. Вы по-прежнему называете add или put, но это менее уродливо:

private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() {{
    put("foo",      1);
    put("bar",      256);
    put("data",     3);
    put("moredata", 27);
    put("hello",    32);
    put("world",    65536);
 }};
7 голосов
/ 27 августа 2008

Также не забывайте, что Map и Hashtable являются общими в Java 5 и выше (как и в любом другом классе в Framework коллекций ).

Map<String, Integer> numbers = new HashMap<String, Integer>();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);

Integer one = numbers.get("one");
Assert.assertEquals(1, one);
2 голосов
/ 27 августа 2008
import java.util.HashMap;

Map map = new HashMap();
1 голос
/ 27 августа 2008

Что Эдмунд сказал.

Что касается того, чтобы не звонить .add все время, нет, не идиоматически. Были бы различные хаки (сохранение их в массиве и затем зацикливание), которые вы могли бы сделать, если бы вы действительно этого хотели, но я бы не рекомендовал это.

0 голосов
/ 03 мая 2019
Hashtable<Object, Double> hashTable = new Hashtable<>();

положить значения ...

получить максимум

Optional<Double> optionalMax = hashTable.values().stream().max(Comparator.naturalOrder());

if (optionalMax.isPresent())
 System.out.println(optionalMax.get());
0 голосов
/ 26 октября 2012

Важно отметить, что хеш-функция в Java меньше оптимальной. Если вы хотите меньше коллизий и почти полное устранение повторного хеширования с пропускной способностью ~ 50%, я бы использовал алгоритм Buz Hash Buz Hash

Причина слабого алгоритма хеширования Java наиболее очевидна в том, как он хеширует строки.

"a".hash() даст вам представление ASCII "a" - 97, поэтому "b" будет 98. Весь смысл хеширования заключается в назначении произвольного и «как можно более случайного» числа.

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

0 голосов
/ 27 августа 2008

И есть ли способ заполнить таблицу списком пар ключ-> значение без отдельного вызова метода add для объекта для каждой пары?

Одна проблема с вашим вопросом состоит в том, что вы не упоминаете, в какой форме находятся ваши данные для начала. Если бы ваш список пар оказался списком объектов Map.Entry, это было бы довольно просто.

Просто, чтобы выбросить это, есть класс (очень злобный) с именем java.util.Properties, который является расширением Hashtable. Он ожидает только строковые ключи и значения и позволяет загружать и хранить данные с использованием файлов или потоков. Формат файла, который он читает и пишет, выглядит следующим образом:

key1=value1
key2=value2

Я не знаю, ищите ли вы это, но бывают ситуации, когда это может быть полезно.

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