Я хочу иметь карту с повторяющимися ключами.
Я знаю, что существует множество реализаций карт (Eclipse показывает мне около 50), поэтому держу пари, что должна быть такая, которая позволяет это. Я знаю, что легко написать собственную карту, которая сделает это, но я бы предпочел использовать какое-нибудь существующее решение.
Может быть, что-то в общих коллекциях или гугл-коллекциях?
java
duplicates
guava
multimap
IAdapter
источник
источник
Ответы:
Вы ищете мульти-карту, и действительно, как у общих коллекций, так и у Guava есть несколько реализаций для этого. Multimaps позволяют использовать несколько ключей, поддерживая набор значений для каждого ключа, т.е. вы можете поместить один объект на карту, но вы получите коллекцию.
Если вы можете использовать Java 5, я бы предпочел Guava, так
Multimap
как он поддерживает дженерики.источник
com.google.common.collect.HashMultimap
имеетreadObject
/writeObject
методы, как и ArrayListMultimap и Immutable {List, Set} Multimap. Я считаю бесполезный десериализованный экземпляр ошибкой, о которой стоит сообщить.Нам не нужно зависеть от внешней библиотеки Google Collections. Вы можете просто реализовать следующую карту:
Обязательно настройте код.
источник
Выход:
Примечание: нам нужно импортировать файлы библиотеки.
http://www.java2s.com/Code/Jar/g/Downloadgooglecollectionsjar.htm
или https://commons.apache.org/proper/commons-collections/download_collections.cgi
источник
Вы можете просто передать массив значений для значения в обычном HashMap, таким образом имитируя повторяющиеся ключи, и вам решать, какие данные использовать.
Вы также можете просто использовать MultiMap , хотя мне сама идея дублирования ключей не нравится.
источник
TreeMap<String, ArrayList<MyClass>>
решило мои потребности в дублировании ключей.Если вы хотите перебрать список пар ключ-значение (как вы написали в комментарии), то лучше использовать список или массив. Сначала объедините свои ключи и значения:
Замените Class1 и Class2 типами, которые вы хотите использовать для ключей и значений.
Теперь вы можете поместить их в массив или список и перебрать их:
источник
Эту проблему можно решить с помощью списка записей на карте
List<Map.Entry<K,V>>
. Нам не нужно использовать ни внешние библиотеки, ни новую реализацию Map. Запись на карте может быть создана следующим образом:Map.Entry<String, Integer> entry = new AbstractMap.SimpleEntry<String, Integer>("key", 1);
источник
источник
Учитесь на моих ошибках ... пожалуйста, не выполняйте это самостоятельно. Guava multimap - это то, что вам нужно.
Распространенное усовершенствование, которое требуется в мультиотображениях, - запретить дублирование пар "ключ-значение".
Реализация / изменение этого в вашей реализации может раздражать.
В Гуаве это так просто, как:
источник
У меня был немного другой вариант этой проблемы: требовалось связать два разных значения с одним и тем же ключом. Просто разместив его здесь на случай, если он поможет другим, я ввел HashMap в качестве значения:
В приведенном выше коде ключевой frameID считывается из первой строки входного файла в каждой строке, значение для frameTypeHash создается путем разделения оставшейся строки и первоначально сохранялось как объект String, в течение некоторого периода времени, когда файл начинался с нескольких строк ( с разными значениями), связанный с тем же ключом frameID, поэтому frameTypeHash был перезаписан последней строкой в качестве значения. Я заменил объект String другим объектом HashMap в качестве поля значения, это помогло сохранить один ключ для другого сопоставления значений.
источник
Никаких необычных библиотек не требуется. Карты определяются уникальным ключом, поэтому не сгибайте их, используйте список. Потоки сильны.
И это все. Примеры использования:
источник
источник
Java-карта-дублирующие клавиши
источник
как насчет такого имплта MultiMap?
источник
Не могли бы вы также объяснить контекст, для которого вы пытаетесь реализовать карту с повторяющимися ключами? Я уверен, что может быть лучшее решение. Карты предназначены для хранения уникальных ключей по уважительной причине. Хотя, если вы действительно хотели это сделать; вы всегда можете расширить класс, написав простой пользовательский класс карты, который имеет функцию смягчения конфликтов и позволит вам сохранить несколько записей с одинаковыми ключами.
Примечание. Вы должны реализовать функцию смягчения конфликтов таким образом, чтобы конфликтующие ключи преобразовывались в уникальный набор «всегда». Что-то простое, например, добавить ключ с хэш-кодом объекта или что-то в этом роде?
источник
для полноты: Коллекции Apache Commons также имеют MultiMap . Обратной стороной, конечно же, является то, что Apache Commons не использует Generics.
источник
Немного взломав, вы можете использовать HashSet с повторяющимися ключами. ВНИМАНИЕ: это сильно зависит от реализации HashSet.
источник
Если есть повторяющиеся ключи, то ключ может соответствовать более чем одному значению. Очевидное решение - сопоставить ключ со списком этих значений.
Например, в Python:
источник
Я использовал это:
java.util.List<java.util.Map.Entry<String,Integer>> pairList= new java.util.ArrayList<>();
источник