J'ai deux ensembles, A et B, du même type.
Je dois trouver si A contient un élément de l'ensemble B.
Quelle serait la meilleure façon de le faire sans itérer sur les décors? La bibliothèque Set a contains(object)
et containsAll(collection)
, mais pas containsAny(collection)
.
Réponses:
Ça ne
Collections.disjoint(A, B)
marcherait pas ? De la documentation:Ainsi, la méthode retourne
false
si les collections contiennent des éléments communs.la source
Stream::anyMatch
Depuis Java 8, vous pouvez utiliser
Stream::anyMatch
.la source
anyMatch
diffusera tous les élémentssetA
et les appellerasetB.contains()
tous. Si "true" est renvoyé pour l'un des éléments, l'expression dans son ensemble sera évaluée à true. J'espère que cela vous a aidé.Une bonne façon d'implémenter containsAny pour les ensembles consiste à utiliser Guava Sets.intersection () .
containsAny
retournerait unboolean
, donc l'appel ressemble à:Cela renvoie vrai si les ensembles sont disjoints, sinon faux. La complexité temporelle de ceci est probablement légèrement meilleure que retenue Tout parce que vous n'avez pas à faire de clonage pour éviter de modifier votre ensemble d'origine.
la source
Apache Commons a une méthode
CollectionUtils.containsAny()
.la source
J'utilise org.apache.commons.collections.CollectionUtils
C'est tout! Renvoie true si au moins un élément se trouve dans les deux collections.
Simple à utiliser et le nom de la fonction est plus suggestif.
la source
Utiliser
retainAll()
dans l'interface Set. Cette méthode fournit une intersection d'éléments communs aux deux ensembles. Consultez la documentation de l'API pour plus d'informations.la source
retainAll
cela n'aidera probablement pas. Sa mise en œuvre enAbstractCollection
itérations.O(1)
temps d'exécution dans le meilleur des cas, alorsretainAll
qu'il aurait quelque chose dans le sens d'unO(N)
(cela dépendrait de la taille d'un seul ensemble) meilleur temps de fonctionnement.Je recommanderais de créer un à
HashMap
partir de l'ensemble A, puis d'itérer à travers l'ensemble B et de vérifier si un élément de B est dans A. Cela fonctionnerait dans leO(|A|+|B|)
temps (car il n'y aurait pas de collisions), alors qu'ilretainAll(Collection<?> c)
doit fonctionner dans leO(|A|*|B|)
temps.la source
Il y a une méthode un peu approximative pour le faire. Si et seulement si l'ensemble A contient un élément B que l'appel
modifiera l'ensemble A. Dans cette situation, removeAll renverra true (comme indiqué dans removeAll docs ). Mais vous ne voulez probablement pas modifier l'ensemble A, vous pouvez donc penser à agir sur une copie, comme ceci:
et la valeur de retour sera vraie si les ensembles ne sont pas distincts, c'est-à-dire qu'ils ont une intersection non vide.
Voir aussi les collections Apache Commons
la source
Vous pouvez utiliser la méthode retenueAll et obtenir l'intersection de vos deux ensembles.
la source
retainAll
il est nécessaire de faire une copie de l'ensemble d'origine. Ensuite, il est plus efficace à utiliserHashSet
comme suggéré par Zéychin .