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

如何按属性值比较两个Java对象列表

巫马盛
2023-03-14

我想断言,相同类型的两个对象列表在该对象的属性值方面是相同的。例如,我有两个Person对象列表,它们具有名字、姓氏和中间名属性。每个Person对象都有这些属性(java bean)的方法setter和getter,构造函数不包含任何参数。

让我们假设这里已经有一个名为existingPersonList的两个人的列表,该列表具有以下属性:

现有人员1:firstName=鲍勃,lastName=史密斯
现有人员2:firstName=苏,middleName=K,lastName=怀特

我想比较对象,所以我采取的方法是创建新的对象来比较:

Person person1 = new Person(); 
Person person2 = new Person();
List<Person> personList = new ArrayList<>();
person1.setFirstName("Bob");
person1.setLastName("Smith");
person2.setFirstName("Sue");
person2.setMiddleName("K.");
person2.setLastName("White");
personList.add(person1);
personList.add(person2);

我目前正在使用for循环和Hamcrest方法(personList.get(I))遍历这两个列表。匹配(existingPersonList.get(j))以查找匹配项和assertTrue,但是对于大型列表来说,这是非常低效的。

有没有更好的方法来做到这一点?或者至少直接比较两个列表,而不是迭代?

共有1个答案

刁远
2023-03-14

通过重写对象的equal和hash方法,可以使用列表的compare方法,如下例所示:

这有助于您根据需要尽可能多地比较对象的属性。

       import java.util.*;

    public class TestListConvert {

    public static void main(String[] args) {
        List<Obs> firstList = new ArrayList<>();

        List<Obs> secondList = new ArrayList<>();

        firstList.add(new Obs("1","2"));
        secondList.add(new Obs("1","2"));

        System.out.println(firstList.equals(secondList));

    }
    private static class Obs{
        private  String x;
        private String y;

        public Obs(String x, String y) {
            this.x = x;
            this.y = y;
        }

        public String getX() {
            return x;
        }

        public void setX(String x) {
            this.x = x;
        }

        public String getY() {
            return y;
        }

        public void setY(String y) {
            this.y = y;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Obs obs = (Obs) o;
            return Objects.equals(x, obs.x) &&
                    Objects.equals(y, obs.y);
        }

        @Override
        public int hashCode() {
            return Objects.hash(x, y);
        }
    }
}
 类似资料:
  • 问题内容: 我有两个列表 , 都包含 MyData 类型的对象,而 MyData* 包含这些变量。 利斯塔和数组listB都包含MyData的对象,现在我要两个列表的对象值比较这里 的名字 ,以及 检查 变量一样,如果 利斯塔 包含这些对象值 和ListB也包含 然后我必须比较列表并返回false,因为两个列表相同但是如果ListA包含 和 ListB 包含 然后我必须比较列表并返回true,因为

  • 问题内容: 我有两个从同一类实例化的java对象。 如果我将它们的两个属性都设置为完全相同的值,然后验证它们是否相同 但是,这些方法都不返回真实值。我已经检查了每个属性,并且它们匹配。 如何比较这两个对象以验证它们是否相同? 问题答案: 你需要提供自己的实现。 如果哈希表中有可能使用你的对象,则还应该重写。一个合理的实施将是该对象的字段的哈希码喜欢的东西结合起来:

  • 但是,这两种方法都不返回真值。我已经检查了每个属性,它们都匹配。 如何比较这两个对象以验证它们是相同的?

  • 第一次来这里,所以我希望这是有意义的! 我有两个对象数组,比如l1和l2,我想在这两个列表之间进行比较,并在l3中得到一个不匹配的值。用户类包含2个字符串: 比如,l1包含:Java、JSF、JAXR、foo l2包含:JSF、JAXR 我可以对匹配的值进行比较,但不能对不匹配的值进行比较。这种逻辑似乎有缺陷。有什么帮助吗? 对于匹配值: 但是,对于不匹配,当我说不等于时,我得到的不是唯一的值,而

  • 在爪哇中。如果我们必须将一个对象与另一个对象进行比较。我们比较该对象中的每个字段。 学生 1 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。学生 2 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。因此,要检查2名学生是否相等...我们比较每个字段。 但是,如果 Student 对象有许多字段,该怎么办?学生1对象有标记1,标记2,标记3,名称,年龄,地址,颜色,类,国家,部