所以我认为我可以使用HashMap,但它不会起作用,因为第一个键不是唯一的 - 它在数据集中的独特之处在于键1和键2的组合。
我考虑将键连接成一个字符串以强制唯一性,我认为这应该有效,但我想确认没有任何其他方法。为了清楚起见,我希望有一个数据结构,我可以......
这适用于嵌套的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检查 - 应该只是第二个条件
答案 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会更自然。