それらが拡張するスーパークラスが表示されないため、リストを手動で反復処理する必要があります。たとえば、属性にゲッターとセッターがあり、それPersonNpi.name
はほぼ同じであり、のようなPerson.firstname + Person.lastname
関数があり、クラスにはsと比較するメソッドがあると想定しています。その場合、最初の配列をループし、2番目の配列に等しいものがあるかどうかすべての項目をチェックします。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
:あなたの2番目の質問は、、、Person
およびのさらなる実装に極端に依存していなくても、非常に重要PersonNpi
です。Employee
今のところ、Person
との間の同等性を検証するいくつかのメソッドがあるともう一度仮定しますPersonNpi
。
実行されるループが2つあるため、1つのループでチェックを行わないことをお勧めします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);
このメソッドでは、3人のクラスすべてにメソッドを実装する必要があります。これはequals(Object)
、のようなスーパークラスの下に配置することを検討してくださいHuman
。その場合、あなたはにすることができObject ArrayList
ますArrayList<Human>
1つのループで(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
とでは、 -listにnpiList
doubleを追加して、他の2つのリストから即座に削除するため、singleのみが残ります。Employee
このメソッドを使用して、2つのリストの残りのシングルを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
。