【问题标题】:How to Compare Two Lists of Java Objects by Property Values如何按属性值比较两个 Java 对象列表
【发布时间】:2020-04-10 02:46:37
【问题描述】:

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

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

现有人员 1:firstName = BoblastName = Smith
现有人员 2:firstName = SuemiddleName = K.lastName = White

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

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 方法 samePropertyValue(personList.get(i)).matches(existingPersonList.get(j)) 来查找匹配项和 assertTrue,但是这对于大型列表非常低效。

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

【问题讨论】:

  • 什么是“直接比较”,而不是遍历它们?
  • Person implements Comparable&lt;Person&gt; 或覆盖Object.equals(Object anObject)
  • 直接比较,确保第一个列表中每个对象的对象属性与第二个列表中某些对象的对象属性匹配。我考虑过覆盖等于,但想知道是否有工具可以“直接”执行此操作

标签: java testing hamcrest


【解决方案1】:

通过覆盖对象的 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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多