2012-03-13 64 views
3

我在redis中發現了這個,並試圖查看Java中是否有類似的東西。假設我有以下數據:在Java中是否存在這樣的數據類型?

3:1 
3:2 
3:3 
4:1 

正如您可以看到非數據點本身是唯一的,但組合是唯一的。有一個在Redis的命令:

sadd 3 1 2 
sadd 3 3 
sadd 4 1 

這會給我是這樣的:

3 -> 1, 2, 3 
4 -> 1 

通過做這樣smembers 3東西(這將返回家居3)或smembers 3 2(這將返回如果子值存在)。

我想知道在Java中最接近這個功能的是什麼?

回答

7

番石榴MultiMap接口正是如此。請注意,是否允許重複<K,V>對,取決於具體實施。這聽起來像是在K,V對總是唯一的地方。如果是這樣,看看HashMultimap課程。


但是,如果你想推出自己的,你可能尋找的MapSet組合:Map<Integer,Set<Integer>>

當您添加(鍵,值)元素的地圖:

  1. 首先檢查密鑰是否在那裏。如果不是,則需要添加一個空的Set<Integer>
  2. 然後,做map.get(key).put(value);

當你想要檢索與特定鍵的所有元素:

  1. do map.get(key)和當你想看看是否對結果

迭代具體的鍵/值對在那裏:

  1. if(map.containsKey(key) && map.get(key).contains(value))

要額外的功勞,你可以在一個包裝中實現所有這些。來自番石榴的ForwardingMap可能是一個很好的開始。

1

維基百科:

在其外層,Redis的數據模型是其中鍵 被映射到值的字典。

換句話說,只需使用一個Map來存儲鍵值對。請注意,地圖只是一個界面。您將需要使用實現Map接口的子類創建一個Map對象,例如HashMap,TreeMap等。我認爲您對數據結構本身和其方法的實現感到困惑。你提到的那些函數可以用Java輕鬆實現。

2

您可以創建自己的類MultivalueMap這樣的:

import java.util.Set; 
import java.util.Map; 
import java.util.HashMap; 
import java.util.List; 
import java.util.ArrayList; 

public class MultiValueMap<T1, T2> { 

    public Map<T1, List<T2>> map = null; 

    public MultiValueMap(){ 
     this.map = new HashMap(); 
    } 

    public void putList(T1 key, List<T2> list){ 

     map.put(key, list); 
    } 

    public void put(T1 key, T2 value){ 
     List<T2> list = null; 
     if(map.get(key) == null){ 
      list = new ArrayList<T2>(); 
      map.put(key, list); 
     } 
     else { 
      list = map.get(key); 
     } 
     list.add(value); 
    } 

    public List<T2> get(T1 key){ 
     return map.get(key); 
    } 

    public Set<T1> keySet(){ 

     return map.keySet(); 
    } 

    public Map getMap(){ 

     return this.map; 
    } 

    public boolean contains(T1 key, T2 listValue){ 

     List<T2> list = map.get(key); 

     return list.contains(listValue); 
    } 
} 
1

您可以通過使用Java中的集合框架實現這一目標。

當您正在尋找要存儲的鍵值對時。

你可以在java中使用MapSet

Map<Integer ,Set<Integer>> 
相關問題