我在redis中找到了这个,并试图看看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中最接近这个功能的是什么?
答案 0 :(得分:7)
Guava MultiMap
界面就是这样做的。请注意,它是否允许重复的<K,V>
对由特定实现决定。这听起来像你在K,V对总是独一无二的。如果是这样,请查看HashMultimap
类。
但是,如果你想推广自己的,那么你可能正在寻找Map
和Set
的组合:Map<Integer,Set<Integer>>
向地图添加(键,值)元素时:
Set<Integer>
。map.get(key).put(value);
如果要使用特定键检索所有元素:
do map.get(key)
并迭代结果如果您想查看特定的键/值对是否在其中:
if(map.containsKey(key) && map.get(key).contains(value))
要获得额外的功劳,您可以在包装器中实现所有这些功能。来自番石榴的ForwardingMap
可能是一个很好的起点。
答案 1 :(得分: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);
}
}
答案 2 :(得分:1)
Java没有直接内置的东西。你可以使用像
这样的东西Map<Integer, Set<Integer>>
存储关系。 Java tutorial on the Map
interface讨论了这种结构。你也可以使用Guava的MultiMap<Integer, Integer>
。
答案 3 :(得分:1)
来自维基百科:
在其外层,Redis数据模型是键的字典 映射到值。
换句话说,只需使用Map来存储键值对。请注意,Map只是一个界面。您将需要使用实现Map接口的子类创建Map对象,例如HashMap,TreeMap等。我认为您对数据结构本身及其方法的实现感到困惑。您提到的那些功能可以很容易地用Java实现。
答案 4 :(得分:1)