需要像<key(not =“”unique)=“”<key,=“”double =“”>&gt;对于ds - 不知道该使用什么

时间:2017-02-24 05:40:37

标签: java data-structures hashmap

所以我认为我可以使用HashMap,但它不会起作用,因为第一个键不是唯一的 - 它在数据集中的独特之处在于键1和键2的组合。

我考虑将键连接成一个字符串以强制唯一性,我认为这应该有效,但我想确认没有任何其他方法。为了清楚起见,我希望有一个数据结构,我可以......

  1. 查找第一个键
  2. 查找第二个键
  3. 访问双重存储
  4. 这适用于嵌套的HashMap,但由于第一个键不是唯一的,因此它将使用新的第二个键进行更新,并在下一次迭代中加倍。

    从搜索开始,似乎有一个建议是使用Apache的库中的Multimap,但我不希望在访问第一个键时返回一个列表。我最终只想通过访问第一个键然后访问第二个键来获得双倍。

    有什么建议吗?或者我应该尝试连接工作吗?

    示例代码

    if(map.get(first[1]) != null &&
         map.get(first[1]).get(second[1]) != null) {
    
         HashMap<String, Double> inner = map.get(first[1]);
         inner.put(second[1], inner.get(second[1]) + 1.0);
    
    } else {
    
         map.put(first[1], new HashMap<>());
         map.get(first[1]).put(second[1], 1.0);
    }
    

    实际上不需要AND检查 - 应该只是第二个条件

1 个答案:

答案 0 :(得分:0)

您不需要多图。你的第一直觉是对的,你可以Map<FirstKey, Map<SecondKey, Integer>>来做。但要插入其中,您必须考虑到FirstKey的内部地图可能已创建或未创建的可能性。

根据您的编辑,我认为您希望计算第二个键已插入地图的次数,而不是将特定值与其关联。我已经重写了这个答案,将其考虑在内。

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

public void insert(Map<String, Map<String, Integer>> map, String first, String second) {
    Map<String, Integer> inner = map.computeIfAbsent(first, k -> new HashMap<>());
    inner.put(second, inner.getOrDefault(second, 0) + 1);
}

public int lookup(Map<String, Map<String, Integer>> map, String first, String second) {
    return map.getOrDefault(first, new HashMap<>()).getOrDefault(second, 0);
}

如果你想使用Double而不是Integer,这是一个很容易的改变,但如果我们只计算出现次数,Integer会更自然。