提问者:小点点

一种更容易检测物体之间差异的方法?(爪哇)


例如,我有一个名为StudentListA和StudentListB的arraylist,其中包含许多学生。

={学生1,学生2,学生3......}

StudentListB={Student A,Student B,Student C….}

每个学生都有自己的属性,如姓名、地址、gpa等。我如何比较学生1和学生A的属性值是否相同,等等。

现在我在想这样的事情:

int i = 0;
for (Student student : StudentListA){
   if(student.getName().equals(studentListB.get(i).getName() && 
      student.getAddress().equals(studentListB.get(i).getAddress()....){
        //Do smtg
   }
i++;

}

有更简单的方法吗?因为我有很多优点。我想知道第一个和第二个名单上的学生是否完全相同。


共3个答案

匿名用户

您应该将属性比较移动到Student#equals方法。然后在循环中使用Student#equals

for (Student student : StudentListA){
   if(student.equals(studentListB.get(i))){
        //Do smtg
   }
i++;

}

你可以看看Lombock EqualsAndHashCode——这是生成#equals方法的最简单方法。

如果你不允许使用lombock,那么你必须自己编写Student#equals

在现实世界中,很少为#equals编写实现,因为IDE可以帮助您生成它。

public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            Student student = (Student) o;

            if (this.name != null ? !name.equals(student.name) : student.name != null) return false;

            return true;
        }

匿名用户

有更简单的方法吗?因为我有很多优点。

Java本身没有捷径来测试两个不同的对象是否具有彼此相等的所有相应属性。但是,您可以编写一个执行这种测试的方法,以便您可以重用它,并且更好地分解您的代码。您也可以选择它作为给定类型的对象的值相等的定义,方法是实现该比较的方法覆盖Object.equals()

如果你覆盖了对象。equals()然后确保覆盖对象。hashcode(),以保持与equals()的一致性。测试结果相等的对象应该具有相同的哈希代码,尽管不一定相反。

匿名用户

  1. 正如其他文章所建议的,Key的实现是覆盖equals和hashCode,这是必须的。这可以很容易地使用IDE/eclipse生成代码。
  2. 实现java.lang.可比接口
  3. 覆盖comareTo方法

//示例实现,

public int compareTo(Student o){
  
if (o.hashCode() < this.hashCode()){return -1}
 else if(o.hashCode() > this.hashCode()) {return 1}

  return 0;

}

使用集合。排序

现在您有两个排序列表,您可以使用轻松比较两个排序列表。