Java 哈希映射比较

Java 哈希映射比较,java,hashmap,Java,Hashmap,我有两个哈希图。这只是2个hashmaps的示例,可以有n个hashmaps 它们看起来像这样 HashMap A = [(a, 23),(b,25),(c,43),(d,34)] HashMap B = [(a, 32),(b,52),(d,55)] 现在我想用这种方式比较这些HashMap,这样我就可以将丢失的键“c”放入HashMap B中,值为0 我该怎么做?记住,可以有n个HashMaps 让我们调用目标HashMap,它将获取丢失的键和其他每个键的源。对于每个源中的每个键,如果目标

我有两个哈希图。这只是2个hashmaps的示例,可以有n个hashmaps

它们看起来像这样

HashMap A = [(a, 23),(b,25),(c,43),(d,34)]
HashMap B = [(a, 32),(b,52),(d,55)]
现在我想用这种方式比较这些HashMap,这样我就可以将丢失的键“c”放入HashMap B中,值为0


我该怎么做?记住,可以有n个HashMaps

让我们调用目标HashMap,它将获取丢失的键和其他每个键的源。对于每个源中的每个键,如果目标不包含该键,则将零与目标中的该键关联:

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);
}
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);
    }
  }
}

这两种解决方案都在*k上执行,其中n是映射数,k是每个映射中的平均键数。

让我们将目标哈希映射称为将获取缺少的键和其他每个键的源的哈希映射。对于每个源中的每个键,如果目标不包含该键,则将零与目标中的该键关联:

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);
    }
  }
}
这两种解决方案都在*k上执行,其中n是贴图的数量,k是每个贴图中的平均键数。

您可以执行A.keySet.removeAllB.keySet,它将为您提供A中不在B中的所有项目。

您可以执行A.keySet.removeAllB.keySet,它将为您提供A中不在B中的所有项目

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是您想要放入其中的任何缺省值

有一些合理的优化路线,比如将设置的关键点的大小与目标地图的大小进行比较,这将允许您分为两个合理的类别:相同的大小,非常接近0或keys.size,或者其他

其中,n-maps是映射的一个Iterable或数组,而defaultObject是您想要放入其中的任何缺省值

有一些合理的优化路线,比如将设置的关键点的大小与目标地图的大小进行比较,这将允许您分为两个合理的类别:相同的大小,非常接近0或keys.size,或者其他。

有一些东西可以帮到您:

Map<K, V> a = ...
Map<K, V> b = ...
MapDifference<K, V> difference = Maps.difference(a, b);
你如何处理一系列地图取决于你需要对它们做什么,而你并没有真正解释。。。但您可以通过对每一对地图执行上述操作来循环它们,以确保最后一个地图至少包含其他地图中的每个条目,例如。

有一些东西可以帮助您:

Map<K, V> a = ...
Map<K, V> b = ...
MapDifference<K, V> difference = Maps.difference(a, b);

你如何处理一系列地图取决于你需要对它们做什么,而你并没有真正解释。。。但您可以通过对每对映射执行上述操作来循环它们,以确保最后一个映射至少包含其他映射中的每个条目,例如。

在第二种情况下,这样我们就不会对containsKey进行N^2次调用,从而使您的函数有效地位于^2,我宁愿只计算每个有问题的映射的键集差。该函数仍在^2上,因为差分已打开且已执行N次,但常数因子可能较低。如果从其他对象在循环中获取这些hashmaps,该如何执行?啊,是的,SetremoveAll将以两个设置大小常量中的较小者执行,但具有相同的大值。如果它在现实中产生差异,当然取决于数据的真实性=但是,仔细想想,计算关键点集差异需要您创建一个包含所有关键点的新集,从中删除每个贴图的现有关键点,以避免对allKeys集进行变异。这个额外的步骤增加了allKeys大小的恒定时间工作,因此我认为它实际上不会为您带来任何好处。在第二种情况下,为了不需要对containsKey进行N^2次调用,这将有效地使您的函数位于^2上,我宁愿只计算所讨论的每个映射的键集差异。该函数仍在^2上,因为差分已打开且已执行N次,但常数因子可能较低。如果从其他对象在循环中获取这些hashmaps,该如何执行?啊,是的,SetremoveAll将以两个设置大小常量中的较小者执行,但具有相同的大值。如果它在现实中产生差异,当然取决于数据的真实性=但是,仔细想想,计算关键点集差异需要您创建一个包含所有关键点的新集,从中删除每个贴图的现有关键点,以避免对allKeys集进行变异。这个额外的步骤增加了所有键大小的恒定时间工作,因此我认为它实际上不会给您带来任何好处;修改A可能是不可取的,甚至是不允许的。对键集的修改也会修改基础映射;这可能是不可取的或不可取的 en允许修改A。