J'ai deux listes avec des objets différents.
List<Object1> list1;
List<Object2> list2;
Je veux vérifier si l'élément de list1 existe dans list2, basé sur un attribut spécifique (Object1 et Object2 ont (entre autres), un attribut mutuel (de type Long), nommé attributeSame).
maintenant, je le fais comme ceci:
boolean found = false;
for(Object1 object1 : list1){
for(Object2 object2: list2){
if(object1.getAttributeSame() == object2.getAttributeSame()){
found = true;
//also do something
}
}
if(!found){
//do something
}
found = false;
}
Mais je pense qu'il existe un moyen meilleur et plus rapide de le faire :) Quelqu'un peut-il le proposer?
Merci!
Réponses:
Si vous avez juste besoin de tester l'égalité de base, cela peut être fait avec le JDK de base sans modifier les listes d'entrée sur une seule ligne
Si vous avez besoin de tester une propriété spécifique, c'est plus difficile. Je recommanderais, par défaut,
... qui recueille les valeurs distinctes
list2
et teste chaque valeurlist1
pour la présence.la source
list1
dans unSet
avant de comparer, vous obtiendrez O (n) + O (m), c'est-à-dire O (n + m), au prix d'un peu de RAM supplémentaire; il s'agit de choisir entre la vitesse ou la mémoire.Vous pouvez utiliser Apache Commons CollectionUtils :
Cela suppose que vous avez correctement surchargé la fonctionnalité d'égalité pour vos objets personnalisés.
la source
Pour raccourcir la logique de Narendra, vous pouvez utiliser ceci:
la source
list1.stream().anyMatch(list2::contains);
Il existe une méthode de
Collection
nommerretainAll
mais ayant des effets secondaires pour vous référenceC'est comme
la source
La réponse de Loius est correcte, je veux juste ajouter un exemple:
la source
plus rapide nécessitera un espace supplémentaire.
Par exemple:
mettre tous les éléments dans une liste dans un HashSet (vous devez implémenter la fonction de hachage par vous-même pour utiliser object.getAttributeSame ())
Parcourez l'autre liste et vérifiez si un élément se trouve dans le HashSet.
De cette manière, chaque objet est visité au plus une fois. et HashSet est assez rapide pour vérifier ou insérer n'importe quel objet dans O (1).
la source
Selon le JavaDoc pour
.contains(Object obj)
:Donc, si vous remplacez votre
.equals()
méthode pour votre objet donné, vous devriez pouvoir faire:if(list1.contains(object2))...
Si les éléments sont uniques (c'est-à-dire qu'ils ont des attributs différents), vous pouvez remplacer
.equals()
et.hashcode()
et tout stocker dansHashSets
. Cela vous permettra de vérifier si l'un contient un autre élément en temps constant.la source
pour le rendre plus rapide, vous pouvez ajouter une pause; de cette façon, la boucle s'arrêtera si found est défini sur true:
Si vous aviez des cartes au lieu de listes avec comme clés l'attributSame, vous pourriez rechercher plus rapidement une valeur dans une carte s'il existe une valeur correspondante dans la deuxième carte ou non.
la source
Pouvez-vous définir le type de données que vous détenez? est-ce du big data? est-il trié? Je pense que vous devez envisager différentes approches d'efficacité en fonction des données.
Par exemple, si vos données sont volumineuses et non triées, vous pouvez essayer d'itérer les deux listes ensemble par index et stocker chaque attribut de liste dans un autre assistant de liste. alors vous pouvez recouper les attributs actuels dans les listes d'aide.
bonne chance
édité: et je ne recommanderais pas de surcharger les égaux. son dangereux et probablement contre votre sens objet oop.
la source
org.springframework.util.CollectionUtils
la source
Avec
java 8
, nous pouvons faire comme ci-dessous pour vérifier si une liste contient un élément d'une autre listela source
Si vous souhaitez vérifier si un élément existe dans une liste, utilisez la méthode contains.
la source