Vergleichen Sie 2 Java arraylists verschiedene Objekte und fügen Sie die passenden Zeilen in eine neue Liste
Müssen wir vergleichen 2 arraylists der verschiedenen Objekte haben einige gemeinsame Felder, und speichern Sie dann die passenden Zeilen in eine neue arraylist. Ich habe nach Lösungen gesucht, aber war nicht in der Lage zu bekommen, was ich brauche.
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;
Also brauche ich, um zu überprüfen, ob die name & address in the PersonNpi object in the PersonNpiList match to a Person object in the PersonList
, und wenn ja, speichern Sie die Person details + Npi to a new Arraylist<Employee>
Hoffe, ich bin bei der Frage deutlich. Bitte lassen Sie mich wissen, wie lösen Sie diese effizient.
Dank
Harry
EDIT:
Brauche ich zum speichern der nicht-übereinstimmenden Zeilen (die auf der ersten arraylist) als auch auf einer anderen Liste. Brauche ich eine weitere Schleife oder kann ich es auf die gleiche For-Schleife? Wer bitte?
- Wir erstellen die Objekte also nicht möglich, die Objekte Bearbeiten
Iterator
,contains
,add
,equals
ist alles, was Sie brauchen- Stellen Sie sicher, dass die Allgemeinen Felder sind zugänglich durch eine Schnittstelle, die implementiert wird durch die beiden Klassen, die Sie verwenden. Die Sie implementieren können, ein Komparator die auf die Schnittstelle.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da sehe ich keine Oberklassen, aus denen Sie zu erweitern, Sie manuell zu Durchlaufen und Ihre Listen. Ich gehe davon aus, dass eine Menge, zum Beispiel, dass Sie Getter und setter für die Attribute, die
PersonNpi.name
ist mehr oder weniger das gleiche wiePerson.firstname + Person.lastname
, dass Sie eine Funktion inAddress
wieboolean checkEquality(String street1, String street2, String city, String state, String zip)
, dass IhrPerson
Klasse hat einegetName()
- Methode zu vergleichen, mitPersonNpi
s. In diesem Fall wird eine Schleife durch die erste Reihe, und prüfen Sie für jedes Element, wenn die zweite hat nichts ihm gleich.Wieder, ich habe eine Menge von Annahmen, auch die, die Sie haben eine
Employee
Konstruktor, der nur erfordert diePerson
und diePersonNpi
ab und ruft die erforderlichen Informationen entsprechend.Sollten Sie mehr erarbeiten, verwenden Oberklassen, und verwenden Sie die
contains()
Funktion. In anderen Worten, stellen Sie einen Vergleich derPerson
und diePersonNpi
einfacher durch eine Funktion.Bearbeiten: deine zweite Frage ist sehr, wenn nicht extrem abhängig, Ihre weitere Umsetzung der
Employee
,Person
undPersonNpi
. Für jetzt, ich werde noch einmal angenommen, Sie haben einige Methoden, die überprüfen, Gleichheit zwischenEmployee
,Person
undPersonNpi
.Ich würde vorschlagen, um nicht die Kontrolle in einer Schleife, da haben Sie zwei
ArrayLists
die lief durch. DiePersonNpi
-Liste lief durch für jeden Datensatz in der erstenList
. Also, was könnte passieren, nachdem wir alles überprüft, ein paarPersons
Links sind unerreicht und ein paarPersonNpis
Links sind unerreicht, da wir nicht die fahne, diePersons
undPersonNpis
haben wir abgestimmt.Abschließend: für Leichtigkeit halber, fügen Sie einfach diesen Teil:
Diese Methode erfordert die Implementierung der
equals(Object)
Methode für alle 3 person-Klassen, die Sie vielleicht in Erwägung ziehen, unter einer Superklasse wieHuman
. In diesem Fall können Sie dieObject ArrayList
in eineArrayList<Human>
Mit einer Schleife (erfordert
equals(Object)
Methode für die 3 person-Klassen):Erklärung: wir Schleife mit
Iterators
durch die beiden Listen, uns zu ermöglichen, entfernen Sie aus der Liste während der Iteration. So in derpersonList
und dienpiList
nur die singles bleiben, wie wir hinzufügen, verdoppelt sich derEmployee
-Liste, sofort entfernen Sie Sie aus den beiden anderen Listen. Fügen wir die verbleibenden Einzel in die beiden Listen auf unserernonMatchedPerson
-Liste mit denaddAll
Methode.Edit2: Wenn Sie nicht Bearbeiten können Sie diese Klassen, aus welchem Grund auch immer, 3 wrapper Klassen, so etwas wie:
Wenn Sie diesen Ansatz verwenden, ändern Sie diese Zeile in der Schleife:
zu diesem:
Anhand dieser können Sie noch implementieren Ihre eigenen
equals()
Methode.Andere Lösung könnte sein, dass Sie eine statische Methode wie diese:
Nun rufen
Person.equals(person, personNpi)
, vorausgesetzt, Sie setzen die Methode in der KlassePerson
.Wenn Sie equals zum Vergleich die Werte in Frage, dann können Sie
contains
um zu sehen, ob Objekt ist in der anderen Liste.Ansonsten müssen Sie manuell Durchlaufen, obwohl die Listen und prüfen Sie jedes Objekt.
Und wenn Sie mit jdk8 Lambda, Sie könnte so etwas tun (kompiliert und läuft btw mit dem richtigen jdk) :
Etwas wie dies funktionieren sollte. Es wird davon ausgegangen, dass Sie einen Weg für den Bau einer
Employee
aus einerPerson
und einPersonNpi
. Auch, weil Sie nicht sagen, die Struktur einerAddress
werde ich überlasse es Ihnen, um die Adresse zu schreiben matching-Logik.Dies ist eine O(n2) - operation. Könnten Sie diese Fahrt wesentlich durch die Sortierung beider arrays mit name und Adresse. Die Sortier-operation ist O(n log(n)) und Vergleich könnte dann umgesetzt werden als O(n) - operation.
Verwenden
HashMap
zum speichern der ersten ListePersonNpiList
. Verwendenmap.get(Person) == null
zu überprüfen, ob die person in der hash-map.