当前位置: 首页 > 知识库问答 >
问题:

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

郜彦
2023-03-14

例如,我有一个名为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个答案

堵浩波
2023-03-14
  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;

}

使用集合。排序

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

徐柏
2023-03-14

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

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

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

谢墨竹
2023-03-14

您应该将属性比较移动到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;
        }
 类似资料:
  • 基本模式学习和检测各种异常。 谢谢你。

  • 下面是我的解决方案,但我不清楚“删除”的情况下代码应该是什么样子 删除字符的代码应该是什么样子的? 更新-添加了更多的示例 下面是Dmitry和Ingen答案的比较:https://dotnetfiddle.net/mjqdao

  • 问题内容: 我有一个带有键侦听器的JList,使用户可以轻松地从列表中删除项目。在Windows上,它工作正常。您按删除键,该项目将被删除。在Mac上,程序不响应删除键。我正在使用,我认为这是检测特殊密钥的平台无关的方法。我应该在Mac上检测按键的方式吗? 问题答案: 例如

  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 在swift中似乎有两个相等运算符:双相等()和三相等(),这两者有什么区别?

  • 问题内容: 已经尝试了一个示例程序来理解Java 6 和方法之间的区别。但是它们似乎是相同的,有什么建议吗? 问题答案: 区别在于,由于队列容量限制,添加失败时会发生什么: 引发(未经检查的)异常, 返回。 在实现的中记录了这一点。 值得注意的是,它没有容量限制,因此基本上不会抛出异常(并且总是会返回);例如,这与具有初始容量的建筑物不同。