Как создать хеш-таблицу в Java?
Вопрос
Каков самый простой способ создания хеш-таблицы (или ассоциативного массива...) в Java?Мой гугл-фу нашел пару примеров, но есть ли стандартный способ сделать это?
И есть ли способ заполнить таблицу списком пар ключ->значение без отдельного вызова метода добавления объекта для каждой пары?
Решение
Map map = new HashMap();
Hashtable ht = new Hashtable();
Оба класса можно найти в пакете java.util.Разница между ними объясняется следующим: Запись часто задаваемых вопросов jGuru.
Другие советы
Для настройки данных можно использовать двойные скобки.Вы по-прежнему вызываете 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);
}};
Также не забывайте, что и Map, и Hashtable являются общими в Java 5 и более поздних версиях (как и в любом другом классе в Структура коллекций).
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);
import java.util.HashMap;
Map map = new HashMap();
Что Эдмунд сказал.
Насчет того, чтобы не вызывать .add постоянно, нет, не идиоматически.Если бы вы действительно этого хотели, вы могли бы использовать различные хаки (сохранение их в массиве и последующее зацикливание), но я бы не рекомендовал их.
И есть ли способ заполнить таблицу списком пар ключ->значение без отдельного вызова метода добавления объекта для каждой пары?
Одна из проблем с вашим вопросом заключается в том, что вы изначально не упоминаете, в какой форме находятся ваши данные.Если бы ваш список пар оказался списком объектов Map.Entry, это было бы довольно просто.
Чтобы выбросить это из головы, есть (очень оклеветанный) класс с именем java.util.Properties, который является расширением Hashtable.Он ожидает только строковые ключи и значения и позволяет загружать и хранить данные с помощью файлов или потоков.Формат файла, который он читает и записывает, следующий:
key1=value1
key2=value2
Я не знаю, то ли это вы ищете, но бывают ситуации, когда это может быть полезно.
Важно отметить, что хеш-функция Java не оптимальна.Если вы хотите меньше коллизий и почти полное исключение повторного хеширования при мощности ~ 50%, я бы использовал алгоритм Buz Hash. Буз Хэш
Причина слабости алгоритма хеширования Java наиболее очевидна в том, как он хэширует строки.
"a".hash()
дать вам ASCII-представление "a"
- 97
, так "b"
было бы 98
.Весь смысл хеширования заключается в присвоении произвольного и «насколько возможно случайного» числа.
Если вам нужна быстрая и грязная хеш-таблица, обязательно используйте java.util
.Если вы ищете что-то надежное и более масштабируемое, я бы рассмотрел возможность реализации вашего собственного.
Hashtable<Object, Double> hashTable = new Hashtable<>();
поставить ценности ...
получить максимум
Optional<Double> optionalMax = hashTable.values().stream().max(Comparator.naturalOrder());
if (optionalMax.isPresent())
System.out.println(optionalMax.get());