2012-03-13 23 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>> 
相关问题