У нас есть MultiBiMap?

Как и сейчас, существует концепция BiMap и multiMap, но существует ли multiBiMap? так что я имею в виду под этим. В multiMap у вас есть отношение «один ко многим» между K и V, один ключ может быть связан с несколькими значениями, отсюда и название. В бикарте у вас есть пара K, V, которая является двунаправленной, что означает, что вы также можете получить отношение V, K. Как иметь две обычные карты, но синхронизированные. Мне нужна двунаправленная мультикарта, в которой вы сочетаете эти две концепции.


person AR5HAM    schedule 05.12.2013    source источник
comment
если вам не нужно сохранять фактические пары, вы можете получить тот же эффект (или реализовать свой собственный), используя две мультикарты (по одной в каждую сторону)   -  person Thayne    schedule 05.12.2013
comment
Ну, проблема в том, что я хотел что-то простое, например: multiBiMap‹Integer, Integer›, где, если у вас есть ключ, вы получаете все значения, связанные с этим ключом, и если у вас есть значение, вы можете получить ключ. Но, как вы сказали, это было бы возможно реализовать. Я просто не хотел изобретать велосипед, если он уже существует.   -  person AR5HAM    schedule 05.12.2013
comment
Гарантируется ли уникальность значений?   -  person Thayne    schedule 05.12.2013
comment
Если у вас есть ключ, вы получаете все значения, связанные с этим ключом, и если у вас есть значение, вы можете получить ключ. Под значением the вы подразумеваете одно из значений, связанных с определенным ключом?   -  person gdejohn    schedule 05.12.2013
comment
Да, под значениями здесь я подразумеваю значения, связанные с конкретным ключом. так что в основном у нас есть отношение один ко многим. Один ключ ко многим значениям.   -  person AR5HAM    schedule 05.12.2013
comment
Нет, я имею в виду, когда вы говорите получить ключ, если у вас есть значение, вы говорите об одном из значений, связанных с ключом? Например, "a"->[1, 2, 3], getKeyForValue(2) == "a"?   -  person gdejohn    schedule 05.12.2013
comment
Может ли одно и то же значение быть связано с несколькими ключами? Другими словами, вам нужна связь «многие ко многим»?   -  person gdejohn    schedule 05.12.2013
comment
ОП сказал, что ему нужны отношения «один ко многим».   -  person Thayne    schedule 05.12.2013
comment
Вопрос неоднозначный. Общее отношение — один ко многим, если значения уникальны. Но если значение может быть связано с несколькими ключами, то отношение должно быть «многие ко многим», где он, вероятно, хотел бы представление «один ключ ко многим значениям в одном направлении» и «одно значение к другому». многие ключи вид в другом направлении. Если это «один ко многим» и вы можете иметь как "a"->[1, 2], так и "b"->[2, 3], то какой ключ связан со значением 2?   -  person gdejohn    schedule 05.12.2013
comment
@gdejohn да, ваше описание / пример верны. getKeyForValue(2) должен возвращать a. Также, как вы упомянули, да, значение потенциально может быть связано с несколькими ключами. Google нашел API, который реализует как BiMap, так и MultiMap, а не оба вместе. Вот ссылка [ссылка] (code.google.com/p/guava- библиотеки/вики/)   -  person AR5HAM    schedule 05.12.2013
comment
Итак, если у вас есть и "a"->[1, 2], и "b"->[2, 3], то вам нужен getInverse(2) == ["a", "b"]? И вам нужно, чтобы он был изменчивым?   -  person gdejohn    schedule 05.12.2013
comment
да, в случае, если значение сопоставлено более чем с одним ключом, вы получите набор ключей, с которыми оно сопоставляется. В данном случае а и б. API Google для biMap возвращает только инверсное представление, которое сопоставляет каждое из значений bimap со связанным с ним ключом. Но опять же в их реализации BiMap не является multiMap.   -  person AR5HAM    schedule 05.12.2013
comment
Вам нужно, чтобы он был изменчивым?   -  person gdejohn    schedule 05.12.2013
comment
да, было бы очень хорошо, если бы он был изменчивым.   -  person AR5HAM    schedule 05.12.2013
comment
Тогда я не знаю ничего, что соответствовало бы вашим потребностям из коробки. ImmutableMultimap в Guava обеспечивает обратное представление, но это не годится. Однако не должно быть слишком сложно придумать простую реализацию. Вы хотите, чтобы я попробовал и отправил ответ?   -  person gdejohn    schedule 05.12.2013
comment
Конечно, но я также хотел бы начать проект gitHub для этого. Еще одна проблема, которую я вижу в Guava (и я еще не смотрел на их реализации, но я предполагаю, что это так), вся их реализация использует библиотеки коллекций Java, которые неэффективны для начала, поскольку все они основаны на массивах. Я уверен, что смогу найти еще несколько человек, которые хотели бы попробовать решить эту проблему.   -  person AR5HAM    schedule 05.12.2013


Ответы (1)


person    schedule
comment
Я написал нечто подобное некоторое время назад, но мне не нравится тот факт, что у меня было два списка, но это тоже должно работать. - person AR5HAM; 05.12.2013
comment
Я просто не думаю, что концептуально возможно получить желаемый двунаправленный поиск без поддержки двух мультикарт. - person gdejohn; 05.12.2013
comment
да, я согласен, но было бы неплохо, если бы это было реализовано и абстрагировано для вас. Вместо того, чтобы писать это самостоятельно. :-) - person AR5HAM; 24.09.2020