java - 比较不同对象的 2 个 Java 数组列表,并将匹配的行添加到新列表中

标签 java arraylist compare match

我们需要比较具有一些公共(public)字段的不同对象的 2 个数组列表,然后将匹配的行存储到一个新的数组列表中。我已经寻找解决方案,但无法得到我需要的东西。

List<Person> personList = new ArrayList<Person>();
Person:
private String firstName;
    private String lastName;
    private String street1;
    private String street2;
    private String city;
    private String stateCode;
    private String zipCode;

List<PersonNpi> npiList = new ArrayList<PersonNpi>();
PersonNpi:
private String name;
    private String npi;
    private Address address;

所以我需要检查 name & address in the PersonNpi object in the PersonNpiList match to a Person object in the PersonList 是否,如果是,请保存 Person details + Npi to a new Arraylist<Employee>

希望我能清楚地回答这个问题。请让我知道如何有效地解决这个问题。

谢谢

哈利

编辑:

我需要将不匹配的行(在第一个数组列表上)保存到另一个列表中。我是否需要另一个循环,或者我可以在同一个 For 循环上执行此操作吗?请问有人吗?

最佳答案

由于我没有看到它们扩展的任何父类(super class),因此您必须手动迭代列表。我假设了很多,例如你的属性有 getter 和 setter,即 PersonNpi.name或多或少与 Person.firstname + Person.lastname 相同,你在Address中有一些功能喜欢 boolean checkEquality(String street1, String street2, String city, String state, String zip) ,那你的Person类有一个 getName()PersonNpi 进行比较的方法s。在这种情况下,循环遍历第一个数组,并检查第二个数组中的每个项目是否有与其相等的内容。

ArrayList<Employee> employees = new ArrayList<Employee>();
for(Person person : personList) {
  for(PersonNpi personNpi : npiList) {
    if (person.getName().equals(personNpi.getName()) && 
        person.getAddress().checkEquality(...address parts here...)) {
      employees.add(new Employee(person, personNpi));
    }
  }
}

我再次做了很多假设,还有一个假设是 Employee构造函数只需要 PersonPersonNpi ,并相应地获取所需的信息。

您应该详细说明,使用父类(super class),并使用 contains()功能。换句话说,比较 PersonPersonNpi通过函数更容易。

编辑:您的第二个问题高度依赖于您对 Employee 的进一步实现(如果不是极其依赖的话)。 , PersonPersonNpi 。现在,我再次假设您有一些方法可以验证 Employee 之间的相等性。 , PersonPersonNpi

我建议不要在一个循环中进行检查,因为你有两个 ArrayLists都经过了。 PersonNpi -list 对第一个 List 中的每条记录都进行遍历。因此,在我们检查了所有内容之后可能会发生一些Persons没有匹配,还有一些 PersonNpis不匹配,因为我们没有标记哪个 PersonsPersonNpis我们已经匹配了。

结论:为了简单起见,只需添加这部分:

ArrayList<Object> nonMatchedPersons = new ArrayList<Object>();
for (Person person : personList) 
    if (!employees.contains(person))
        nonMatchedPersons.add(person);
for (PersonNpi personNpi : npiList) 
    if (!employees.contains(personNpi))
        nonMatchedPersons.add(personNpi);

此方法确实需要您实现 equals(Object)所有 3 人类的方法,您可以考虑将其放在像 Human 这样的父类(super class)下面。在这种情况下,您可以将 Object ArrayList进入ArrayList<Human>

一个循环(需要 equals(Object) 3 人类(class)的方法):

List<Employee> employees = new ArrayList<Employee>();
ArrayList<Object> nonMatchedPersons = new ArrayList<Object>();

Iterator<Person> personIterator = personList.iterator();
while (personIterator.hasNext()) {
    Iterator<PersonNpi> npiIterator = npiList.iterator();
    while(npiIterator.hasNext()) {
        Person person = personIterator.next();
        PersonNpi personNpi = npiIterator.next();
        if (person.equals(personNpi)) {
            employees.add(new Employee(person, personNpi));
            personIterator.remove();
            npiIterator.remove();
        }
    }
}

nonMatchedPersons.addAll(personList);
nonMatchedPersons.addAll(npiList);

解释:我们用 Iterators 循环通过两个列表,使我们能够在迭代时从列表中删除。所以在 personListnpiList ,只剩下单打,因为我们将 double 添加到 Employee -list,立即将它们从其他两个列表中删除。我们将两个列表中剩余的单曲添加到我们的nonMatchedPerson中。 - 列出 addAll方法。

Edit2:如果您出于某种原因无法编辑这些类,请创建 3 个包装类,例如:

public class PersonWrapper {
    private Person person;

    public PersonWrapper(Person person) {
        this.person = person;
    }

    @override
    public boolean equals(Object other) {
        if (other == null) 
            return false;
        if (other instanceof PersonWrapper) {
            //etc etc, check for equality with other wrappers.
            ...
        }
    }
}

如果您选择使用此方法,请更改循环中的这一行:

if (person.equals(personNpi)) {

对此:

if (new PersonWrapper(person).equals(new PersonNpiWrapper(personNpi))) {

使用它,您仍然可以实现自己的equals()方法。

另一种解决方案可能是您创建一个如下所示的静态方法:

public static boolean equals(Object this, Object that) {
    if (this instanceof Person || this instanceof PersonNpi) //et cetera, et cetera
        return true;
    return false;
}

现在只需调用 Person.equals(person, personNpi) ,假设您将该方法放入类 Person 中.

关于java - 比较不同对象的 2 个 Java 数组列表,并将匹配的行添加到新列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13706524/

相关文章:

java - 当发生文本更改事件时获取父文本组件

java - 颜色无法解析或不是字段

java - 如何仅将不同的元素从一个 arrayList 复制到另一个 ArrayList

java - RowFilter.NumberFilter : can't handle "mixed" concrete number types

javascript - 检查是否有两个以上的日期范围重叠

java - 非法转义字符 "\"

java - ExtJS 无限网格永远加载(totalProperty == pageSize)

java - Android Search ArrayList of objects for only a parameter,返回对象索引

java - 如何将句子分成两部分?

c - 比较两个相同长度字符串的最快方法