半唯一嵌套Java地图?

时间:2018-07-06 15:08:52

标签: java dictionary nested

我已经看到了一些与此有关的问题,但实际上没有一个与我正在尝试做的事情有关的问题。

我需要的示例:

我有一个键(字符串),键(字符串),值(整数):

“盐”,“盐”,0

“盐”,“辣椒”,1

我希望能够拨打电话:

map.get("Salt"), and have it:
  A: Return "Salt" and "Pepper"
map.get("Salt").get("Salt")) and have it:
  A. Return 0
map.get("Salt").get("Pepper")) and have it:
  A. Return 1

我已经尝试了嵌套的Linked / hashmaps,但是添加第二个salt值会覆盖第一个盐...而且我不知道如何拥有它,因此第二个键不会覆盖第一个盐。

2 个答案:

答案 0 :(得分:1)

您可以使用Map<String, Map<String, Integer>>

Map<String, Map<String. Integer>> map =
    new HashMap<>();

添加这样的值:

map.computeIfAbsent("Salt", k -> new HashMap<>())
    .put("Salt", 0);
map.computeIfAbsent("Salt", k -> new HashMap<>())
    .put("Pepper", 1);

然后,为您的示例:

  1. map.getOrDefault("Salt", emptyMap()).keySet())
  2. map.getOrDefault("Salt", emptyMap()).get("Salt")
  3. map.getOrDefault("Salt", emptyMap()).get("Pepper")

答案 1 :(得分:0)

您可以通过以下课程来实现。参见working code here

class CustomMap<K1, K2, V>
{
    private HashMap<K1, HashMap<K2, V>> map;
    public CustomMap()
    {
        map = new HashMap<>();
    }

    public void put(K1 key1, K2 key2, V value) {
        HashMap<K2, V> lMap = map.get(key1);
        if(lMap != null) lMap.put(key2, value);
        else
        {
            lMap = new HashMap<>();
            lMap.put(key2, value);
            map.put(key1, lMap);
        }

    }

    public Set<K2> get(K1 key) {
        HashMap<K2, V> lMap =  map.get(key);
        return lMap == null ? null : lMap.keySet();
    }

    public V get(K1 key, K2 key2) {
        HashMap<K2, V> lMap =  map.get(key);
        if(lMap == null) return null ;
        return lMap.get(key2);
    }
}

以下是使用的示例代码:

    CustomMap<String, String, Integer> map = new CustomMap<>();
    map.put("Salt", "Salt", 0);
    map.put("Salt", "Pepper", 1);

    System.out.println(map.get("Salt"));
    System.out.println(map.get("Salt", "Pepper")); 

输出

[Salt, Pepper]
1