Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何比较两个映射的入口集_Java_Collections - Fatal编程技术网

Java 如何比较两个映射的入口集

Java 如何比较两个映射的入口集,java,collections,Java,Collections,我有两个hashmap,我只想比较它们的键以及它们的值 Student stu1=new Student(1, "student_1_Name"); Student stu2=new Student(2, "student_2_Name"); Map<Integer, Student> map1= new Hashmap<Integer, Student>(); Map<Integer, Student> map2= new Hashmap<Integ

我有两个hashmap,我只想比较它们的键以及它们的值

Student stu1=new Student(1, "student_1_Name");
Student stu2=new Student(2, "student_2_Name");

Map<Integer, Student> map1= new Hashmap<Integer, Student>();
Map<Integer, Student> map2= new Hashmap<Integer, Student>();

map1.put(1, stu1);
map2.put(2, stu2);

System.out.println("is there any diff.==="+map1.entrySet().equals(map2.entrySet()));
Student stu1=新学生(1,“学生名”);
学生stu2=新学生(2,“学生姓名”);
Map map1=新的Hashmap();
Map map2=新的Hashmap();
map1.put(1,stu1);
map2.put(2,stu2);
System.out.println(“是否存在任何差异==”+map1.entrySet().equals(map2.entrySet()));
据我所知:

  • map.keySet():提供映射的键
  • map.values():提供映射的值
  • map.entrySet():提供键和值

上面的代码片段总是给出false。我只想比较两个贴图的值和键。请告诉我如何比较两个映射?

Equals和entryset的hashcode将比较映射实现本身的实例,而不是元素

通常的机制是对比较键或值的条目集进行迭代,如下所示:

for (Map.Entry<String, String> entry : map.entrySet())
{
    System.out.println(entry.getKey() + "/" + entry.getValue());
    myBoolean = entry.getKey().equals(myOtherString);
}
for(Map.Entry:Map.entrySet())
{
System.out.println(entry.getKey()+“/”+entry.getValue());
myBoolean=entry.getKey().equals(myOtherString);
}

必须迭代集合。例如:

private boolean isEqual(map1, map2){
  for (Integer i : map1.keySet())
    if(map2.contains(i))
      if(! map1.get(k).equlas(map2.get(k)))
        return false;
    else return false;
  return true;
}
该计划:

import java.util.HashMap;
import java.util.Map;

public class Test {
  public static void main(String[] args) {
    Map<Integer, String> map1 = new HashMap<Integer, String>();
    Map<Integer, String> map2 = new HashMap<Integer, String>();
    map1.put(2, "bbb");
    map1.put(1, "aaa");
    map2.put(1, "aaa");
    map2.put(2, "bbb");
    System.out.println(map1.entrySet().equals(map2.entrySet()));
    System.out.println(map1.equals(map2));
  }
}
该问题与该计划有两个显著差异:

  • 我用的是
    String
    ,而不是
    Student
    String
    有一个
    equals()
    和一个
    hashCode()
    ,它们彼此一致,反映的是值,而不是实例相等
  • 我使用了
    java.util.HashMap
    。问题程序使用了Hashmap
    HashMap
    有一个
    equals()
    和一个
    hashCode()
    ,它们彼此一致并遵循
    java.util.Map
    契约

  • 我建议检查
    Student
    Hashmap
    中的
    equals()
    hashCode()
    的实现,不要忘记为Student类实现hashCode+equals

    Yaa,所以如果需要比较两个映射的键和值,我应该怎么做。??另外,我不想把手动逻辑放在这里……不正确。任何正确的
    java.util.Map
    实现都有一个
    equals(Object o)
    ,它“将指定对象与此映射进行相等比较。如果给定对象也是一个映射,并且两个映射表示相同的映射,则返回true。更正式地说,如果m1.entrySet().equals(m2.entrySet()),则两个映射m1和m2表示相同的映射。这可确保equals方法在映射接口的不同实现中正常工作。“您希望准确比较什么?分别输入键和值或输入项(一个输入项的键和值都应等于另一个输入项的键和值)。由于键不同,您会得到false!一个使用
    1
    ,另一个使用
    2
    而不仅仅是按键。这些值也不同。因此,如果它打印的不是
    false
    ,那么肯定有严重错误。谢谢你的提示。但是我说我不想把人工逻辑放在这里。。。因为我的地图是超图,有很多其他的内部地图或POJO对象。所以我只需要使用一些通用的方法,否则我必须先得到map的值,然后比较内部pojo的属性。我不能在学生类上重写equals方法。@user3029929它的equals方法做什么?它不像是在做其他工作。。但在这一点上,我不能使用equals和hashcode方法。正如我所说,这只是一个例子。。我的原始实现更通用。它的代码不知道需要比较哪个类或对象。一切都是动态的。我认为我应该使用反射。根据定义,调用equals(我展示的代码间接调用equals)是询问对象在逻辑上是否与其他对象相等的正确、最通用的方法。
    true
    true