当前位置: 首页 > 知识库问答 >
问题:

如何删除映射中重复的键值对

锺离马鲁
2023-03-14

只有当每个键在map1中都有唯一的值时,我才会陷入如何将键值对从map1转移到map2的困境。

假设我有以下地图:

  • 地图1:[1,2][2,4][4,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;  
}

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

共有3个答案

李俭
2023-03-14

试试这个。。

 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=1,2=2,4=3}

仲孙铭
2023-03-14

看看番石榴酱。。这就是你需要的。。

虽然你的问题已经解决了,但是你可以看看下面的代码,使用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));
    }
}
马飞
2023-03-14

地图

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

 类似资料:
  • 如果我从 2 个不同数据节点上运行的 2 个不同的映射器获得相同的键/值对,并且如果我使用单个化简器,如何消除重复的键/值对并防止它进入化简器? 我是否应该使用合并器,然后检查同一键是否存在重复值,然后在合并器中将其删除?但是组合器将来自单个映射器的所有键值对作为输入,对吗?

  • 输入: 输出: 输入: 线程“main”java.lang.IllegalStateException中的异常:重复键-1.0 我怎么才能修好这个?

  • 我有一个<code>map</code>,它要么更改值,要么将其设置为nil。然后我想从列表中删除nil条目。该列表不需要保存。 这是我目前拥有的: 我知道我可以做一个循环,并有条件地在另一个数组中收集,如下所示: 但这似乎不是那么惯用。有没有一种很好的方法可以在列表上映射函数,随时删除/排除 nils?

  • 问题内容: 假设我们有一个具有这种格式的对象: 我想做一个通过键删除的函数: 问题答案: 该运算符允许您从对象中删除属性。 以下示例都做同样的事情。

  • 假设我有这样的对象数组: 如何从每个对象中删除时间和单词属性?我的输出应该是这样的:

  • 想改进这个问题吗?通过编辑这篇文章添加细节并澄清问题。 我所拥有的是, 我想要的是, 其中,