由于我没有看到它们扩展的任何超类,因此您必须手动遍历您的列表。我假设很多,例如,您的属性有 getter 和 setter,这PersonNpi.name
或多或少相同,您在likePerson.firstname + Person.lastname
中具有某些功能,您的类具有与 s 进行比较的方法。在这种情况下,循环遍历第一个数组,并检查第二个数组是否有任何与其相等的元素。Address
boolean checkEquality(String street1, String street2, String city, String state, String zip)
Person
getName()
PersonNpi
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
,并相应地获取所需的信息。
您应该详细说明,使用超类并使用该contains()
函数。换句话说,通过一个函数使比较Person
和更容易。PersonNpi
编辑:您的第二个问题非常重要,如果不是非常依赖于您对Employee
,Person
和PersonNpi
. 现在,我再次假设您有一些方法可以验证Employee
,Person
和PersonNpi
.
我建议不要在一个循环中进行检查,因为您有两个循环ArrayLists
通过。-list 会针对 first 中的PersonNpi
每条记录运行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
. 在这种情况下,您可以Object ArrayList
将ArrayList<Human>
一个循环(需要equals(Object)
3 个人类的方法):
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
,只剩下单打,因为我们将双打添加到Employee
-list 中,立即将它们从其他两个列表中删除。我们使用该方法将两个列表中剩余的单曲添加到我们的nonMatchedPerson
-list 中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
。