Многозначная хеш-таблица в Java

Я обычно использую ng-show

<li ng-show="variable.length"></li>

, где переменную вы определяете, например,

<div class="list-group-item" ng-repeat="product in store.products">
   <li ng-show="product.length">show something</li>
</div>
25
задан Jonik 27 June 2009 в 09:43
поделиться

11 ответов

Нет. Это своего рода идея хеш-таблиц.

Однако вы можете либо использовать собственные Map > и некоторые служебные методы для создания списка, если он отсутствует, или используйте что-то вроде Multimap из Google Collections .

Пример:

String key = "hello";
Multimap<String, Integer> myMap = HashMultimap.create();
myMap.put(key, 1);
myMap.put(key, 5000);
System.out.println(myMap.get(key)); // prints either "[1, 5000]" or "[5000, 1]"
myMap = ArrayListMultimap.create();
myMap.put(key, 1);
myMap.put(key, 5000);
System.out.println(myMap.get(key)); // always prints "[1, 5000]"

Обратите внимание, что Multimap не является точным эквивалентом раствора домашней выпечки; Hashtable синхронизирует все свои методы, а Multimap не дает такой гарантии. Это означает, что использование Multimap может вызвать проблемы , если вы используете его в нескольких потоках . Если ваша карта используется только в одном потоке,

21
ответ дан 28 November 2019 в 18:17
поделиться

Простой. Вместо того Hashtable , используйте Hashtable > .

1
ответ дан 28 November 2019 в 18:17
поделиться

Вам нужно использовать что-то, называемое MultiMap . Однако это не совсем карта, это другой API. Это примерно то же самое, что Map >,

1
ответ дан 28 November 2019 в 18:17
поделиться

См. Библиотеку коллекций Google для мультикарт и подобных коллекций. Встроенные коллекции не имеют прямой поддержки для этого.

2
ответ дан 28 November 2019 в 18:17
поделиться

Как отмечали другие, нет. Вместо этого рассмотрите возможность использования Multimap , который может отображать множество значений для одного и того же ключа.

Коллекции Google ( обновление : Guava ) содержит одну реализацию и, вероятно, будет вашим лучшим выбором.

Отредактируйте : конечно, вы можете сделать так, как Эрик предлагает , и сохранить коллекцию как значение в вашей Hashtable (или Map, в более общем смысле), но это означает, что вы сами пишете ненужный шаблонный код. При использовании такой библиотеки, как Google Collections, она позаботится о низкоуровневой «сантехнике» за вас. Посмотрите этот прекрасный пример того, как можно упростить ваш код, используя Multimap вместо обычных классов Java Collections.

5
ответ дан 28 November 2019 в 18:17
поделиться

Значения хеш-таблицы - это объект, поэтому вы можете сохранить список

11
ответ дан 28 November 2019 в 18:17
поделиться

Ни в одном из ответов не указано, что я буду делать в первую очередь.

Самый большой скачок, который я когда-либо совершил в своих способностях объектно-ориентированного программирования, был, когда я решил ВСЕГДА создать другой класс, когда казалось, что это может быть даже немного полезным - и это одна из вещей, которую я узнал, следуя этому шаблону.

Почти все время я нахожу, что существует связь между объектами, которые я пытаюсь поместить в хеш-таблицу. Чаще всего есть место для класса - даже для одного или двух методов.

На самом деле, я часто обнаруживаю, что мне даже не нужна структура типа HashMap - простой HashSet подойдет.

Элемент, который вы храните в качестве первичного ключа, может стать идентификатором нового объекта, поэтому вы можете создавать методы equals и hash, которые ссылаются только на этот один объект (eclipse может легко сделать ваши методы equals и hash для вас).

4
ответ дан 28 November 2019 в 18:17
поделиться

То, что вам нужно, это Multimap . API коллекций Google предоставляет прекрасную реализацию этого и многого другого, что стоит изучить. Настоятельно рекомендуется!

2
ответ дан 28 November 2019 в 18:17
поделиться

В хеш-таблице можно использовать пару ключ / значение для хранения информации.

В Java класс Hashtable принимает одно значение для одного ключа. Ниже приводится пример попытки связать несколько значений с одним ключом:

Hashtable<String, String> ht = new Hashtable<String, String>();

ht.put("Answer", "42");
ht.put("Hello", "World");    // First value association for "Hello" key.
ht.put("Hello", "Mom");      // Second value association for "Hello" key.

for (Map.Entry<String, String> e : ht.entrySet()) {
  System.out.println(e);
}

При попытке включить несколько значений ( «Мир» , «Мама» ) в один ключ ( "Hello" ), мы получаем следующий результат для печати записей в Hashtable :

Answer=42
Hello=Mom

Пара ключ / значение "Hello" и «Мир» отсутствует в Hashtable - только вторая запись «Привет» и « Мама » в Hashtable . Это показывает, что нельзя иметь несколько значений, связанных с одним ключом в Hashtable .


Что действительно необходимо здесь, так это multimap , которая позволяет связать несколько значений с один ключ.

Одной из реализаций мультиотображения является Multimap из Коллекции Google :

Multimap<String, String> mm = HashMultimap.create();

mm.put("Answer", "42");
mm.put("Hello", "World");
mm.put("Hello", "Mom");

for (Map.Entry<String, String> e : mm.entries()) {
  System.out.println(e);
}

Это похоже на приведенный выше пример, в котором использовалась Hashtable , но поведение совершенно иное - Multimap позволяет связывать несколько значений с одним ключом. Результат выполнения приведенного выше кода выглядит следующим образом:

Answer=42
Hello=Mom
Hello=World

Как видно, для ключа «Hello» значения «Mom» и «World» " связано с ним. В отличие от Hashtable , он не отбрасывает одно из значений и не заменяет его другим. Multimap может хранить несколько значений для каждого ключа.

7
ответ дан 28 November 2019 в 18:17
поделиться

Вместо того, чтобы давать еще один ответ с использованием multipmap, я спрошу, почему вы хотите это сделать?

Связаны ли несколько значений? Если да, то, вероятно, лучше создать структуру данных для их хранения. Если нет, то, возможно, более целесообразно использовать отдельные карты.

Вы храните их вместе, чтобы можно было итерировать их на основе ключа? Возможно, вы захотите поискать альтернативную структуру данных индексации, например SkipList.

7
ответ дан 28 November 2019 в 18:17
поделиться

Just make your own:

Map<Object, List<Object>> multiMap = new HashMap<Object, List<Object>>();

To add:

  public void add(String key, Object o) {
    List<Object> list;
    if (multiMap.containsKey(key)) {
      list = multiMap.get(key);
      list.add(o);
    } else {
      list = new ArrayList<Object>();
      list.add(o);
      multiMap.put(key, list);
    }
  }
4
ответ дан 28 November 2019 в 18:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: