代码之家  ›  专栏  ›  技术社区  ›  yogsma

哈希映射比较

  •  1
  • yogsma  · 技术社区  · 14 年前

    我有两张散列图。这只是两个hashmaps的例子,可以有n个hashmaps。

    它们看起来像这样

    HashMap A = [(a, 23),(b,25),(c,43),(d,34)]
    HashMap B = [(a, 32),(b,52),(d,55)]
    

    现在我想以这样的方式比较这些hashmaps,这样我就可以将缺少的键'c'放入值为0的HashMap B中。

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

    5 回复  |  直到 14 年前
        1
  •  2
  •   maerics    14 年前

    让我们将“target”HashMap称为将获得丢失的键和其他每个键的“sources”。对于每个源中的每个键,如果目标不包含该键,则将零与目标中的该键关联:

    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
  •  3
  •   ColinD    14 年前

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

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

        3
  •  1
  •   Amir Raminfar Hadi Rasouli    14 年前

    你能做到的 A.keySet().removeAll(B.keySet()) 它会给你A里所有不在B里的东西

        4
  •  0
  •   C. K. Young    14 年前
    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);
    }
    
        5
  •  0
  •   Carl    14 年前
    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() ,或其他。