繁体   English   中英

什么Java数据结构最适合双向多值映射

[英]What Java data structure is best for two-way multi-value mapping

我对Java比较陌生,我对哪种类型的数据结构最适合我的情况有疑问。 我有一组基本上是键值对的数据,但是每个值可以对应于多个键,并且每个键可以对应于多个值。 一个简化的例子是:

  • 红苹果
  • 青苹果
  • 红草莓
  • 绿葡萄
  • 紫色葡萄

考虑到上面的例子,我需要能够返回我拥有的颜色苹果和/或我拥有的红色水果。 实际数据将基于输入文件动态生成,其中每个集合将是100-100,000个值,并且每个值可以对应于另一个集合中的数百个值。

存储和解析这些数据的最有效方法是什么? 我希望尽可能使用java本机的解决方案,而不是像外部数据库那样的东西。

这个问题是相关的,但我不确定如何在我的情况下应用解决方案,因为我需要在两个方向上为每个键分配多个值。

由于Map没有重复键,您可以创建Map<Key, List<Value>> ,或者如果可以,可以使用Guava的Multimap

Multimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("Red", "Apple");
multimap.put("Red", "Strawberry");

System.out.println(multimap.get("Red"));  // Prints - [Apple, Strawberry]

但问题是你不能要求给定对象的键,如果我找到别的东西,我会继续寻找,制作和编辑,希望它有所帮助。

不过,您可以通过迭代地图并找到对象的键来自行反转。

我建议你使用Guava的桌面结构。 使用颜色作为行键和水果作为列键,反之亦然。 具体来说, HashBasedTable非常适合您的情况。

根据您的用例,您不需要为值存储任何内容。 但是,这些Table不允许null值。 您可以使用虚拟Boolean或任何其他统计有用值,即插入的日期和时间,用户,颜色/水果对的数量等。

Table具有您需要的方法,例如column()row() 请记住,文档说这些结构针对行访问进行了优化。 如果您计划通过一个键而不是另一个键访问,这可能对您没有用。

您可以创建自己的自定义数据结构

public class MultiValueHashMap<K, V> {
     private HashMap<K, ArrayList<V>> multivalueHashMap = new HashMap<K, ArrayList<V>>();

    public static void main(String[] args) {
        MultiValueHashMap<String, String> multivaluemap = new MultiValueHashMap<String, String>();
        multivaluemap.put("Red", "Apple");
        multivaluemap.put("Green", "Apple");
        multivaluemap.put("Red", "Strawberry");
        multivaluemap.put("Green", "Grapes");
        multivaluemap.put("Purple", "Grapes");

        for(String k : multivaluemap.keySet()){
            System.out.println(k + " : " + multivaluemap.get(k).toString());
        }
    }

    public void put(K key, V value){
        if (multivalueHashMap.containsKey(key)){
            ArrayList<V> values = multivalueHashMap.get(key);
            values.add(value);
        }else{
            ArrayList<V> values  = new ArrayList<V>();
            values.add(value);
            multivalueHashMap.put(key, values);
        }
    }

    public Set<K> keySet(){
        return multivalueHashMap.keySet();
    }

    public ArrayList<V> get(K key){
        return multivalueHashMap.get(key);
    }
}

输出应该是

红色:[苹果,草莓]

紫色:[葡萄]

绿色:[苹果,葡萄]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM