Как мне создать хеш-таблицу в Java?
Какой самый простой способ создать хеш-таблицу (или ассоциативный массив...) в Java? Мой google-fu показал пару примеров, но есть ли стандартный способ сделать это?
И есть ли способ заполнить таблицу списком пар ключ-> значение без индивидуального вызова метода add для объекта для каждой пары?
7 ответов
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 и выше (как и в любом другом классе в среде Collections).
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);
Что сказал Эдмунд.
Что касается не звонить.add все время, нет, не идиоматически. Были бы различные хаки (сохранение их в массиве и затем зацикливание), которые вы могли бы сделать, если бы вы действительно этого хотели, но я бы не рекомендовал это.
И есть ли способ заполнить таблицу списком пар ключ-> значение без индивидуального вызова метода add для объекта для каждой пары?
Одна из проблем вашего вопроса заключается в том, что вы не упоминаете, в какой форме находятся ваши данные. Если бы ваш список пар оказался списком объектов Map.Entry, это было бы довольно просто.
Просто чтобы выбросить это, есть класс (очень злобный) с именем java.util.Properties, который является расширением Hashtable. Он ожидает только строковые ключи и значения и позволяет загружать и хранить данные с использованием файлов или потоков. Формат файла, который он читает и пишет, выглядит следующим образом:
key1=value1
key2=value2
Я не знаю, если это то, что вы ищете, но бывают ситуации, когда это может быть полезно.
Важно отметить, что хеш-функция Java не оптимальна. Если вы хотите меньше коллизий и почти полное устранение повторного хеширования с пропускной способностью ~50%, я бы использовал алгоритм Buz Hash 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());