【问题标题】:Do we have a MultiBiMap ?我们有 MultiBiMap 吗?
【发布时间】:2013-12-05 03:36:20
【问题描述】:

我们现在有 BiMap 和 multiMap 的概念,但是有 multiBiMap 吗?所以我的意思是什么。 在 multiMap 中,K 和 V 之间存在一对多关系,单个键可以关联到多个值,因此得名。 在双地图中,您有 K,V 对,这是双向的,这意味着您也可以获得 V,K 关系。就像有两个常规地图但同步。我需要一个双向多图,您可以在其中结合这两个概念。

【问题讨论】:

  • 如果您不需要保留实际的对,您可以使用两个多图(单向一个)获得相同的效果(或实现您自己的效果)
  • 好吧,问题是我想要这样简单的东西:multiBiMap 如果你有一个键,你会得到与该键关联的所有值,如果你有值,你可以获得钥匙。但正如你所说,有可能实现它。如果它已经存在,我只是不想重新发明轮子。
  • 值是否保证唯一?
  • "如果您有一个键,您将获得与该键关联的所有值,如果您有该值,您可以获得该键。" the 值是指与特定键关联的值之一吗?
  • 问题含糊不清。如果值是唯一的,则整体关系是一对多的。但是如果一个值可以与多个键相关联,那么关系应该是多对多的,他可能想要一个方向上的一键多值视图和一个值对-另一个方向的多键视图。如果它是一对多的并且您可以同时拥有"a"->[1, 2]"b"->[2, 3],那么与值2 关联的键是什么?

标签: java hashmap multimap bimap


【解决方案1】:
import java.util.Set;

import com.google.common.collect.HashMultimap;
import com.google.common.collect.SetMultimap;

public class ManyToMany<K, V> {
    private final SetMultimap<K, V> keysToValues = HashMultimap.create();

    private final SetMultimap<V, K> valuesToKeys = HashMultimap.create();

    public Set<V> getValues(K key) {
        return keysToValues.get(key);
    }

    public Set<K> getKeys(V value) {
        return valuesToKeys.get(value);
    }

    public boolean put(K key, V value) {
        return keysToValues.put(key, value) && valuesToKeys.put(value, key);
    }

    public boolean putAll(K key, Iterable<? extends V> values) {
        boolean changed = false;
        for (V value : values) {
            changed |= put(key, value);
        }
        return changed;
    }
}

【讨论】:

  • 我写了一些类似的东西,但我不喜欢我有两个列表的事实,但这应该也可以。
  • 我只是不认为在不维护两个多图的情况下获得所需的双向查找在概念上是不可能的。
  • 是的,我同意,但如果能够为您实现和抽象它会很好。而不是自己写一个。 :-)
猜你喜欢
  • 2020-08-22
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 2023-03-13
  • 2017-05-09
  • 2018-12-25
相关资源
最近更新 更多