Comparer 2 Java arraylists de différents objets et ajouter les lignes correspondantes à une nouvelle Liste
Nous avons besoin de comparer 2 arraylists de différents objets ayant en commun certaines des champs, puis stocker les lignes correspondantes à une nouvelle liste de tableaux. J'ai cherché des solutions, mais n'était pas en mesure d'obtenir ce dont j'ai besoin.
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;
Donc j'ai besoin de vérifier si la name & address in the PersonNpi object in the PersonNpiList match to a Person object in the PersonList
, et si oui enregistrer le Person details + Npi to a new Arraylist<Employee>
Espère que je suis clair sur la question. S'il vous plaît laissez-moi savoir sur comment résoudre ce problème de manière efficace.
Grâce
Harry
EDIT:
J'ai besoin d'enregistrer de la non-correspondance des lignes (sur la première liste de tableaux) et d'une autre liste. Dois-je avoir une autre boucle ou je peux le faire sur la même boucle For? Quelqu'un s'il vous plaît?
- Nous générons les objets donc pas possible de modifier les objets
Iterator
,contains
,add
,equals
est tout ce dont vous avez besoin- Assurez-vous que la commune de champs sont accessibles par une interface qui est mis en œuvre par les deux classes que vous utilisez. Vous pouvez mettre en œuvre un Comparateur sur cette interface.
Vous devez vous connecter pour publier un commentaire.
Car je ne vois pas de super-classes à partir de laquelle elles s'étendent, vous devez manuellement parcourir vos listes. Je suis en supposant que beaucoup, par exemple, que vous avez des getters et setters pour vos attributs, qui
PersonNpi.name
est plus ou moins le même quePerson.firstname + Person.lastname
, que vous avez une certaine fonction dansAddress
commeboolean checkEquality(String street1, String street2, String city, String state, String zip)
, que votrePerson
classe a ungetName()
méthode pour comparer avecPersonNpi
s. Dans ce cas, une boucle dans le premier tableau, et de vérifier, pour chaque élément, si la deuxième n'a rien, égale à elle.Encore une fois, j'ai fait beaucoup d'hypothèses, aussi les un que vous avez un
Employee
constructeur qui nécessite juste lePerson
et laPersonNpi
, et obtient les informations nécessaires en conséquence.Vous devriez donner plus de détails, l'utilisation des super-classes, et l'utilisation de la
contains()
fonction. En d'autres termes, la comparaison de laPerson
et laPersonNpi
plus facile grâce à une fonction.Modifier: votre deuxième question est très, si elle n'est pas extrêmement dépend de votre poursuite de la mise en œuvre de
Employee
,Person
etPersonNpi
. Pour l'instant, je vais encore une fois supposons que vous avez quelques méthodes qui permettent de vérifier l'égalité entre lesEmployee
,Person
etPersonNpi
.Je vous suggère de ne pas faire la vérification dans une boucle, puisque vous avez deux
ArrayLists
qui sont a couru à travers. LePersonNpi
-liste est couru à travers pour chaque enregistrement de la premièreList
. Donc ce qui peut arriver, c'est après que nous avons tout vérifié, quelquesPersons
sont de gauche inégalée, et un peu dePersonNpis
sont de gauche inégalée, puisque nous n'avons pas de drapeau quiPersons
etPersonNpis
nous l'avons adaptée.En conclusion: pour facilité l'amour, il suffit d'ajouter cette partie:
Cette méthode vous oblige à mettre en œuvre les
equals(Object)
méthode pour tous les 3 classes de la personne, que vous pourriez envisager de placer sous une superclasse commeHuman
. Dans ce cas, vous pouvez faire laObject ArrayList
dans unArrayList<Human>
Avec une boucle (nécessite
equals(Object)
méthode pour les 3 classes de la personne):Explication: on boucle avec
Iterators
par le biais de deux listes, pour nous permettre de supprimer de la liste lors de l'itération. Ainsi, dans lepersonList
et lanpiList
, seuls les célibataires restent, nous ajoutons de la double à laEmployee
-liste, instantanément retirant les deux autres listes. Nous avons ajouter le reste des singles dans les deux listes à notrenonMatchedPerson
-liste avec lesaddAll
méthode.Edit2: Si vous ne pouvez pas modifier les classes pour quelque raison que ce soit, faire 3 wrapper classes, quelque chose comme:
Si vous choisissez d'utiliser cette approche, modifiez cette ligne dans la boucle:
à ceci:
En utilisant cela, vous pouvez toujours mettre en place votre propre
equals()
méthode.Une autre solution pourrait être de vous faire une méthode statique comme ceci:
Maintenant appelez simplement
Person.equals(person, personNpi)
, en supposant que vous mettre de la méthode dans la classePerson
.Si vous implémenter equals pour comparer les valeurs en question, vous pouvez ensuite utiliser
contains
pour voir si l'objet est dans une autre liste.Sinon, vous devrez manuellement itérer bien que des listes, et vérifie chaque objet.
Et si vous utilisez jdk8 Lambda, vous pourriez faire quelque chose comme ceci (compile et s'exécute btw, avec un bon jdk) :
Quelque chose comme cela devrait fonctionner. Il suppose que vous avez une méthode de construction d'un
Employee
à partir d'unPerson
et unPersonNpi
. Aussi, puisque vous ne dites pas la structure d'unAddress
, je vais le laisser, à vous d'écrire l'adresse logique de correspondance.C'est un O(n2) de l'opération. Vous pourriez accélérer considérablement en triant les deux tableaux, par nom et par adresse. L'opération de tri est O(n log(n)) et la comparaison pourrait alors être mis en œuvre comme un O(n) opérations.
Utilisation
HashMap
pour stocker la première listePersonNpiList
. Utilisationmap.get(Person) == null
pour vérifier si la personne est dans la table de hachage de la carte.