【问题标题】:How to compare two hashmaps in java?如何比较java中的两个hashmap?
【发布时间】:2012-05-30 09:07:49
【问题描述】:

我有两个哈希映射,如下所示:

1.=============Employee=================


Key : 1_10 : Value : 13/04/2012
Key : 1_11 : Value : 18/04/2012
Key : 1_12 : Value : 19/04/2012
Key : 1_14 : Value : 23/04/2012
Key : 1_13 : Value : 20/04/2012
Key : 1_16 : Value : 25/04/2012
Key : 1_1  : Value : 02/04/2012
Key : 1_15 : Value : 24/04/2012
Key : 1_18 : Value : 27/04/2012
Key : 1_3  : Value : 04/04/2012
Key : 1_17 : Value : 26/04/2012
Key : 1_2  : Value : 03/04/2012
Key : 1_5  : Value : 06/04/2012
Key : 1_19 : Value : 30/04/2012
Key : 1_4  : Value : 05/04/2012
Key : 1_7  : Value : 10/04/2012
Key : 1_6  : Value : 09/04/2012
Key : 1_9  : Value : 12/04/2012
Key : 1_8  : Value : 11/04/2012

2.=============Working day=================

Key : 27 : Value : 27/4/2012
Key : 02 : Value : 02/4/2012
Key : 26 : Value : 26/4/2012
Key : 19 : Value : 19/4/2012
Key : 11 : Value : 11/4/2012
Key : 04 : Value : 04/4/2012
Key : 30 : Value : 30/4/2012
Key : 06 : Value : 06/4/2012
Key : 13 : Value : 13/4/2012
Key : 09 : Value : 09/4/2012
Key : 03 : Value : 03/4/2012
Key : 23 : Value : 23/4/2012
Key : 20 : Value : 20/4/2012
Key : 16 : Value : 16/4/2012
Key : 10 : Value : 10/4/2012
Key : 18 : Value : 18/4/2012
Key : 25 : Value : 25/4/2012
Key : 17 : Value : 17/4/2012
Key : 12 : Value : 12/4/2012
Key : 24 : Value : 24/4/2012
Key : 05 : Value : 05/4/2012

键不同,但值相同,有时值不同。

workingdaymap比较时,我想找出employeemap中不存在的值

if (!employeeMap.containsValue(workingdayMap.get(wKey))) {
    //take the value which is not present in employeeMap which is present in workingdayMap
}

但它给了我来自employeeMap的null。

你能帮我解决这个问题吗?

问候 托尼

【问题讨论】:

  • 查看values()函数HashMap
  • 您能否提供更多可以为您提供null 的代码? wKey 来自哪里?您使用的是哪种日期类型,它的 equals() 方法是否符合您的预期?
  • 迭代器 workingDayIterator = workingdayMap.keySet().iterator(); while(workingDayIterator.hasNext()){ String wKey= workingDayIterator.next(); if(!employeeMap.containsValue(workingdayMap.get(wKey))){ // 获取值 } }
  • 好的,该代码看起来不错。 “它给你null”是什么意思?有例外吗?我们可以得到堆栈跟踪吗?

标签: java hashmap


【解决方案1】:

值是日期对象吗?如果是这样,您正在尝试查看地图是否包含相同的对象(以及它的哈希,除非您在两个地图中存储完全相同的实例,否则它会有所不同)而不是对象的值。

【讨论】:

    【解决方案2】:

    这样的事情应该可以工作:

    Set workingValues = new HashSet(workingdayMap.values());
    workingValues.removeAll(employeeMap.values());
    

    我们使用values() 方法从workingdayMap 中获取所有值。我们不想直接修改这个Collection,因为这会修改workingdayMap,所以我们创建一个名为workingValues的值的Set

    然后,我们删除在employeeMap 中找到的所有值,这会将workingdayMap 中但不在employeeMap 中的值保留在workingValues 中。

    【讨论】:

      【解决方案3】:

      你可以试试这样吗。

          HashMap<String, Date> employeeMap = new HashMap<String, Date>();
      
          HashMap<String, Date> workingdaymap = new HashMap<String, Date>();
      
          Set<String> values1 = new HashSet<String>(employeeMap.values());
          Set<String> values2 = new HashSet<String>(workingdaymap.values());
          boolean equal = values1.equals(value2);
      

      【讨论】:

        【解决方案4】:

        下面是完美运行的代码,比较失败的原因是地图值不同。

        Key : 27 : Value : 27/4/2012, Key : 1_18 : Value : 27/04/2012
        

        如果我们看到日期,就会清楚地看到差异。 27/4/201227/04/2012 不同,因为我将其存储为字符串。

        Iterator<Map.Entry<String,String>> holyDayiterator = workingdayMap.entrySet().iterator();
        
                         while (holyDayiterator.hasNext()) {
                            Map.Entry holiDayEntry = holyDayiterator.next();
                            if(!employeeMap.containsValue((holiDayEntry.getValue()))){
                                System.out.println("works perfect");
                            }
        

        感谢大家的支持,也感谢投反对票的人。

        :) 托尼

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-06
          • 2011-07-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多