我有两个哈希图。这只是2个哈希映射的示例,可以有n个哈希映射。
他们看起来像这样
HashMap A = [(a, 23),(b,25),(c,43),(d,34)]
HashMap B = [(a, 32),(b,52),(d,55)]
现在我想以这种方式比较这些哈希图,以便我可以将缺少的'c'键放入HashMap B中,其值为0.
我该怎么做?请记住,可以有n个HashMaps。
答案 0 :(得分:3)
Guava可以为您提供帮助:
Map<K, V> a = ...
Map<K, V> b = ...
MapDifference<K, V> difference = Maps.difference(a, b);
然后MapDifference允许您检查有关两张地图差异的各种信息,例如左边Map
有哪些条目,右边没有,反之亦然。
如果您想确保地图a
中没有b
没有的任何条目,您可以执行以下操作:
b.putAll(difference.entriesOnlyOnLeft());
你如何处理一系列地图取决于你需要用它们做什么,你没有真正解释过......但你可以通过它们循环完成上面的每一对地图,以确保例如,最后一张地图至少包含每个其他地图中的每个条目。
答案 1 :(得分:2)
让我们将“目标”HashMap称为将获得缺失密钥和其他每个“源”的HashMap。对于每个源中的每个键,如果目标不包含键,则将零与目标中的键相关联:
for (Map<String,Number> source : sources) {
for (String key : source.keySet() ) {
if (!target.containsKey(key)) {
target.put(key, 0);
}
}
}
现在,如果您想确保所有地图都包含来自所有其他地图的所有关键字,那么您应首先计算整套关键字并将缺少的关键字添加到每张地图中:
Set<String> allKeys = new HashSet<String>();
for (Map<String,Number> map : allHashMaps) {
allKeys.addAll(map.keySet());
}
for (Map<String,Number> map : allHashMaps) {
for (String key : allKeys) {
if (!map.containsKey(key)) {
map.put(key, 0);
}
}
}
两个解决方案均在O(n * k)处执行,其中n
是地图的数量,k
是每个地图中的平均键数。
答案 2 :(得分:1)
您可以执行A.keySet().removeAll(B.keySet())
,它会为您提供A中不在B
答案 3 :(得分:0)
public static <T> void mergeKeys(Map<T, Integer> target, Map<T, ?>... sources) {
Set<T> newKeys = new HashSet<T>();
for (Map<T, ?> source : sources)
newKeys.addAll(source.keySet());
newKeys.removeAll(target.keySet());
for (T key : newKeys)
target.put(key, 0);
}
答案 4 :(得分:0)
Set<Key> keys = new HashSet<Key>(/* if you have any perspective on size, could put it here */);
for (Map<Key, ?> map : n-maps) keys.addAll(map.keySet());
for (Map<Key, ?> map : n-maps) for (Key k : keys) if(!map.containsKey(k)) map.put(k, defaultObject);
其中n-maps
是Iterable
或您的地图数组,而defaultObject
是您要放在那里的默认值。
有一些合理的优化路线,比如将keys
集的大小与目标map
的大小进行比较,这样可以分成几个合理的类别:相同的大小,非常接近0或keys.size()
,或其他。