我们需要比较具有一些公共(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
构造函数只需要 Person
和 PersonNpi
,并相应地获取所需的信息。
您应该详细说明,使用父类(super class),并使用 contains()
功能。换句话说,比较 Person
和 PersonNpi
通过函数更容易。
编辑:您的第二个问题高度依赖于您对 Employee
的进一步实现(如果不是极其依赖的话)。 , Person
和PersonNpi
。现在,我再次假设您有一些方法可以验证 Employee
之间的相等性。 , Person
和PersonNpi
。
我建议不要在一个循环中进行检查,因为你有两个 ArrayLists
都经过了。 PersonNpi
-list 对第一个 List
中的每条记录都进行遍历。因此,在我们检查了所有内容之后可能会发生一些Persons
没有匹配,还有一些 PersonNpis
不匹配,因为我们没有标记哪个 Persons
和PersonNpis
我们已经匹配了。
结论:为了简单起见,只需添加这部分:
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
循环通过两个列表,使我们能够在迭代时从列表中删除。所以在 personList
和 npiList
,只剩下单打,因为我们将 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/