2

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

假设我有以下地图:

  • 地图1:[1,2] [2,4] [4,4]
  • 地图2:[1,2] [2,4]

我想算法是:

  1. 循环遍历第一个映射中的条目。
  2. 向 map2 添加一个键。
  3. 将一个值添加到一个检查 map2 值的集合中
  4. 如果值重复,则不会将值添加到集合中,并且忽略将其对应的键添加到 map2。

代码片段:

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

我的想法是否应该在正确的轨道上完成?在这里很迷失。

4

3 回答 3

4

当且仅当键不在地图中时,从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.

于 2012-10-06T16:33:14.843 回答
0

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

尽管您的问题已解决,但您可以查看以下代码,以使用GuavaAPI 执行您想要执行的操作:-

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));
    }
}
于 2012-10-06T16:39:31.720 回答
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=一,2=二,4=三}

于 2014-04-24T10:54:47.030 回答