簡體   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