【问题标题】:Compare two hashmaps by keys and return keys which do not have same frequencies通过键比较两个哈希图并返回频率不同的键
【发布时间】:2017-11-15 21:15:47
【问题描述】:

我想按键对两个 HashMap 进行排序并比较它们的值并打印出所有不具有相同值的键。你能帮我怎么做吗?这是我的代码如下。我是 Java 新手,一一学习数据结构。感谢您的帮助。

代码:-

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int val;

        int n = scan.nextInt();
        HashMap<Integer,Integer> h1 = new HashMap<Integer,Integer>();

        for( int i=0;i<n;i++ ) {           
             val = scan.nextInt();
             if(!h1.containsKey(val)) {
                 h1.put(val,1);
             }
            else {
                h1.put(val,h1.get(val)+1);
            }
         }

        int m = scan.nextInt();

        HashMap<Integer,Integer> h2 = new HashMap<Integer,Integer>();

         for( int i=0;i<m;i++ ) {           
             val = scan.nextInt();
             if(!h2.containsKey(val)) {
                 h2.put(val,1);
             }
            else {
                h2.put(val,h2.get(val)+1);
            }
         }

        System.out.println(h1.keySet());   
        System.out.println(h1.values());
        System.out.println(h2.keySet());   
        System.out.println(h2.values());

        }           
}

【问题讨论】:

  • 排序与它有什么关系?
  • Guava 的 Maps.difference() 应该做你想做的事。

标签: java data-structures hashmap


【解决方案1】:

您无需对哈希映射进行排序即可生成所需的输出。相反,构造一个 TreeSet&lt;Integer&gt; 包含来自两个映射的键的联合,像这样

SortedSet<Integer> allKeysSorted = new TreeSet<Integer>();
allKeysSorted.addAll(h1.keySet());
allKeysSorted.addAll(h2.keySet());

使用TreeSet 可确保您的键已排序。现在你可以迭代allKeysSorted,从每个map中获取对应的值,并进行相应的比较:

for (Integer key : allKeysSorted) {
    int v1, v2;
    if (h1.containsKey(key)) {
        v1 = h1.get(key);
    } else {
        v1 = 0;
    }
    if (h2.containsKey(key)) {
        v2 = h2.get(key);
    } else {
        v2 = 0;
    }
    ... // Compare v1 and v2 here
}

【讨论】:

    【解决方案2】:

    应该允许您对地图进行排序。

    SortedSet<Integer> values1 = new TreeSet<Integer>(h1.keySet());
    SortedSet<Integer> values2 = new TreeSet<Integer>(h2.keySet());
    

    应该返回一个具有两个集合唯一值的集合。

        Set<Integer> result = new SortedSet<Integer>(values1);  
        for (Integer element : values2) {
            if (!h1.containsValue(h2.get(element)) {  //If they don't share same value, add it to this new Set
                result.add(element);
            }
            result.remove(element);  //If they both share same value, remove it
        }
    

    最后,打印:

    Iterator iter = result.iterator();
    while (iter.hasNext()) {
        System.out.println(iter.next());
    }
    

    【讨论】:

      【解决方案3】:

      一种方法是合并h1h2 条目,方法是将它们的值减去到新的TreeMap 中,该TreeMap 按键对条目进行排序。然后,我们可以删除值为零的条目:

      Map<Integer, Integer> merged = new TreeMap<>(h1); // Copy h1 into merged
      
      h2.forEach((k2, v2) -> merged.merge(k2, v2, (oldVal, newVal) -> oldVal - newVal));
      
      merged.values().removeIf(v -> v.equals(0));
      

      要打印键,您可以简单地打印地图的键集:

      System.out.println(merged.keySet());
      

      或者迭代它的键并一一打印:

      merged.keySet().forEach(System.out::println);
      

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 2012-07-31
        • 2016-03-11
        • 2014-08-09
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 2018-06-28
        • 2018-08-24
        相关资源
        最近更新 更多