Каков самый простой способ создать хеш-таблицу (или ассоциативный массив ...) в Java? В моем google-fu есть пара примеров, но есть ли стандартный способ сделать это?
И есть ли способ заполнить таблицу списком пар ключ-> значение без индивидуального вызова метода добавления объекта для каждой пары?




import java.util.HashMap;
Map map = new HashMap();
Map map = new HashMap();
Hashtable ht = new Hashtable();
Оба класса можно найти в пакете java.util. Разница между 2 объясняется в следующем Запись часто задаваемых вопросов jGuru.
Что сказал Эдмунд.
Что касается того, чтобы не вызывать .add все время, то нет, не идиоматически. Были бы различные хаки (сохранение его в массиве, а затем цикл), которые вы могли бы использовать, если бы действительно захотели, но я бы не рекомендовал это.
Также не забывайте, что и 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);
And is there a way to populate the table with a list of key->value pairs without individually calling an add method on the object for each pair?
Одна из проблем с вашим вопросом заключается в том, что вы не упоминаете, в какой форме находятся ваши данные. Если бы ваш список пар оказался списком объектов Map.Entry, это было бы довольно просто.
Чтобы выбросить это из головы, существует (очень злонамеренный) класс с именем java.util.Properties, который является расширением Hashtable. Он ожидает только строковые ключи и значения и позволяет загружать и хранить данные с помощью файлов или потоков. Формат файла, который он читает и записывает, следующий:
key1=value1
key2=value2
Не знаю, ищете ли вы это, но бывают ситуации, когда это может быть полезно.
Вы можете использовать двойные фигурные скобки для установки данных. Вы по-прежнему вызываете 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. Map<String,Integer> MYHASH = new Hashtable<String,Integer>()
Важно отметить, что хеш-функция 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());
Привет, не могли бы вы добавить пояснения к своему коду? Вы можете отредактировать свой вопрос, а также использовать форматирование кода. Это кажется неприятным, но на самом деле добавит много пользы.
Из записи jGuru: «Ключевое различие между ними состоит в том, что доступ к Hashtable синхронизируется по таблице, а доступ к HashMap - нет. Вы можете добавить его, но по умолчанию его там нет. Другое отличие состоит в том, что итератор в HashMap является отказоустойчивым, а перечислитель для Hashtable - нет. Если вы измените карту во время итерации, вы узнаете об этом ».