Java HashMap比较完全不一致的质量。相同的键相同的顺序不同的值

Java HashMap比较完全不一致的质量。相同的键相同的顺序不同的值,java,collections,hashmap,comparison,Java,Collections,Hashmap,Comparison,嗨,请在下面找到我的情景 我有两个映射,键为字符串,值为布尔值键和顺序相同。但是这些值可能会改变。 我需要比较两个贴图,如果所有键的值都发生了变化,那么我应该停止 如何进行这种比较 Map <String,Boolean> map1 = new TreeMap<String,Boolean>(); map1.put("String1", true); map1.put("String2", true); map1=newtreemap(); map1.put(“Stri

嗨,请在下面找到我的情景

我有两个映射,键为字符串,值为布尔值键和顺序相同。但是这些值可能会改变。

我需要比较两个贴图,如果所有键的值都发生了变化,那么我应该停止

如何进行这种比较

Map <String,Boolean> map1 = new TreeMap<String,Boolean>();
map1.put("String1", true);
map1.put("String2", true);
map1=newtreemap();
map1.put(“String1”,true);
map1.put(“String2”,真);
map2的可能性

1。值与map1中的值相同。不应停止

Map <String,Boolean> map2 = new TreeMap<String,Boolean>();
map1.put("String1", true);
map1.put("String2", true);
Map <String,Boolean> map2 = new TreeMap<String,Boolean>();
map1.put("String1", true);
map1.put("String2", false);
map2=newtreemap();
map1.put(“String1”,true);
map1.put(“String2”,真);
2。与map1相比,一个值[String2]发生了变化。不应停止

Map <String,Boolean> map2 = new TreeMap<String,Boolean>();
map1.put("String1", true);
map1.put("String2", true);
Map <String,Boolean> map2 = new TreeMap<String,Boolean>();
map1.put("String1", true);
map1.put("String2", false);
map2=newtreemap();
map1.put(“String1”,true);
map1.put(“String2”,假);
3。与map1相比,这两个值都发生了变化。应该到此为止

Map <String,Boolean> map2 = new TreeMap<String,Boolean>();
map1.put("String1", false);
map1.put("String2", false);
map2=newtreemap();
map1.put(“String1”,假);
map1.put(“String2”,假);
对不起,我是新的,所以我在评论中发布了回复


我计划遍历地图并进行检查。在这样做之前,我只想检查一下是否有任何其他简洁的方法来实现这一点。

考虑到两个地图都有确切的键数

 public static void main(String[] args)
    {

        Map map1 = new TreeMap();

        map1.put("String1", true);

        map1.put("String2", true);

        Map map2 = new TreeMap();

        map2.put("String1", false);

        map2.put("String2", false);

        Set keys = map1.keySet();
        boolean stop = true;
        for (Iterator i = keys.iterator(); i.hasNext();)
        {
            String key = (String) i.next();
            boolean value1 = (boolean) map1.get(key);
            boolean value2 = (boolean) map2.get(key);

            if (value1 == value2)
            {
                stop = false;
                break;
            }
        }

        if (stop)
            System.out.println("All values are different");
    }

嗯。你有使用循环的答案,依我看,两者都是完美的,而且有点太复杂了。因此,我将提供我的:

boolean allValuesChanged = 
    map2.entrySet()
        .stream()
        .allMatch(entry -> !map1.get(entry.getKey()).equals(entry.getValue()));
这个答案

  • 它简洁明了
  • 不依赖于键的顺序(因此,无论贴图的类型如何,只要它们具有相同的键,都可以工作)
  • 不使用原始类型
  • 一旦找到两个相等的条目,就停止循环

您尝试过什么?你面临的困难是什么?请注意,标题是HashMap,问题是TreeMap(尽管解决方案是相同的)。如图所示的代码使用TreeMap,因此,如果从它们中提取迭代器,您可以一次遍历一个项,并在其中一个匹配时停止。如果你到了终点,那么他们都不匹配,你的条件也满足了。树形图在这里很关键,因为如果HashMap中项目的#发生显著变化,则HashMap可以更改顺序,从而导致基础哈希表的重新生成。@jbnizet我尝试了通常的迭代和使用布尔值。就像你在问题中尝试的那样。不在注释中。@argoc正在手动检查迭代是唯一的方法,或者我们有更干净的方法,没有太多循环?只要找到两个相等的值,您就可以停止迭代。不需要迭代到末尾。此外,您不应该使用原始类型和类型转换。使用地图。不是一个映射。如果所有的值都不同,那么只有它应该停止,这就是为什么需要在末尾进行迭代。我说的对吗?如果所有值都已更改,OP希望“停止”。所以,如果至少有一个值没有更改,您就知道它不应该停止。@PVR感谢您的解决方案。它解决了我的目的,类似于我的伪代码。当密钥不在map1中时,NPE会怎么样?前提条件是映射具有相同的密钥。所以不需要检查。关于Objects.equals(),这取决于是否认为空值是正常的。我倾向于尽可能避免空值,如果映射包含空值,这通常是一个错误。如果需要,那么应该使用Objects.equals()。@jbnize非常抱歉没有提到java版本。我们使用Java6。我在阅读Java8时看到了循环的这个特性。