如何删除地图中重复的键值对

时间:2012-10-06 16:29:15

标签: java map key-value

只有当每个键在map1中具有唯一值时,我才会坚持如何将键值对从map1传输到map2。

假设我有以下地图:

  • map1:[1,2] [2,4] [4,4]
  • map2:[1,2] [2,4]

我认为算法是:

  1. 循环显示第一张地图中的条目。
  2. 向map2添加密钥。
  3. 为检查map2
  4. 值的集合添加值
  5. 如果值是重复的,则不会将值添加到集合中,并忽略将其对应的键添加到map2。
  6. 代码段:

    public static <K,V> Map<K,V> unique (Map<K,V> m) {
      Map<K,V> newMap = new ArrayMap<K,V>();
    
      //Remember all values in the newMap.
      Set<V> holding = new ArraySet<V>(newMap.values());
    
      for (Map.Entry<K, V> graphEntry : m.entries()) {
         //not sure.
      }
    
      return newMap;  
    }
    

    我的想法是如何在正确的轨道上完成的?在这里很丢失。

3 个答案:

答案 0 :(得分:3)

Map<K, V>创建Map<V, K>,当且仅当密钥不在地图中时才会添加该项目。使用此Map<V, K>,重新创建Map<K, V>

public static <K, V> Map<K, V> createMap(Map<K, V> m) {
    Map<K, V> map = new HashMap<K, V>();
    Map<V, K> tmpMap = new HashMap<V, K>();
    for(Map.Entry<K, V> entry : m.entrySet()) {
        if (!tmpMap.containsKey(entry.getValue())) {
            tmpMap.put(entry.getValue(), entry.getKey());
        }
    }
    for(Map.Entry<V, K> entry : tmpMap.entrySet()) {
        map.put(entry.getValue(), entry.getKey());
    }
    return map;
}

如果您需要保留数据的保留服务顺序,请使用LinkedHashMap代替HashMap

答案 1 :(得分:0)

查看Guava BiMap ..这就是您所需要的......

虽然您的问题已经解决,但您可以查看下面的代码,使用Guava API来完成您的工作: -

public void removeDuplicateValue() {
    Map<Integer, String> existingMap = new HashMap<Integer, String>();
    existingMap.put(1, "a");
    existingMap.put(2, "b");

    // Create a new BiMap
    BiMap<Integer, String> biMap = HashBiMap.create();

    for (Integer val: existingMap.keySet()) {

        // forcePut will add a key-value pair, and overwrite the duplicate value.
        biMap.forcePut(val, existingMap.get(val));
    }

    // Create Inverse Map for newly created BiMap.
    BiMap<String, Integer> inverseBiMap = biMap.inverse();

    for(String val: inverseBiMap.keySet()) {
        System.out.println(val + ":" + biMap.get(val));
    }
}

答案 2 :(得分:0)

试试这个..

 Map<String, String> myMap1 = new TreeMap<String, String>();
 myMap1.put("1", "One");
 myMap1.put("2", "Two");
 myMap1.put("3", "One");
 myMap1.put("4", "Three");
 myMap1.put("5", "Two");
 myMap1.put("6", "Three");

 Set<String> mySet = new HashSet<String>();

 for (Iterator itr = myMap1.entrySet().iterator(); itr.hasNext();)
 {
    Map.Entry<String, String> entrySet = (Map.Entry) itr.next();

    String value = entrySet.getValue();

    if (!mySet.add(value))
    {
        itr.remove();               
    }
 } 

  Map<String, String> myMap2 = new TreeMap<String, String>(myMap1);   

  System.out.println("Result :"+myMap2);

结果:{1 =一,二=二,四=三}