在Java中是否存在这样的数据类型?

时间:2012-03-13 04:57:34

标签: java

我在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中最接近这个功能的是什么?

5 个答案:

答案 0 :(得分:7)

Guava MultiMap界面就是这样做的。请注意,它是否允许重复的<K,V>对由特定实现决定。这听起来像你在K,V对总是独一无二的。如果是这样,请查看HashMultimap类。


但是,如果你想推广自己的,那么你可能正在寻找MapSet的组合:Map<Integer,Set<Integer>>

向地图添加(键,值)元素时:

  1. 首先检查钥匙是否在那里。如果没有,则需要添加空Set<Integer>
  2. 然后,执行map.get(key).put(value);
  3. 如果要使用特定键检索所有元素:

    1. do map.get(key)并迭代结果
    2. 如果您想查看特定的键/值对是否在其中:

      1. 执行if(map.containsKey(key) && map.get(key).contains(value))
      2. 要获得额外的功劳,您可以在包装器中实现所有这些功能。来自番石榴的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)

您可以通过使用Java中的Collections Framework来实现这一目标。

因为您正在寻找要存储的键值对。

您可以在java中使用Map Set

Map<Integer ,Set<Integer>>