jlabel java ejemplo
¿Algo como ''contiene alguno'' para el conjunto de Java? (9)
Tengo dos conjuntos, A y B, del mismo tipo.
Tengo que encontrar si A contiene algún elemento del conjunto B.
¿Cuál sería la mejor manera de hacerlo sin iterar sobre los conjuntos? La biblioteca de conjuntos contains(object) y containsAll(collection) , pero no containsAny(collection) .
¿No funcionaría Collections.disjoint(A, B) ? De la documentación:
Devuelve
truesi las dos colecciones especificadas no tienen elementos en común.
Por lo tanto, el método devuelve false si las colecciones contienen elementos comunes.
Apache Commons tiene un método CollectionUtils.containsAny() .
Desde Java 8: setA.stream().anyMatch(setB::contains)
Hay un método un poco rudo para hacer eso. Si y solo si el conjunto A contiene algún elemento de B que la llamada
A.removeAll(B)
modificará el conjunto A En esta situación, removeAll devolverá verdadero (como se indica en removeAll docs ). Pero probablemente no desee modificar el conjunto A, por lo que puede pensar en actuar sobre una copia, de esta manera:
new HashSet(A).removeAll(B)
y el valor de retorno será verdadero si los conjuntos no son distintos, es decir, tienen una intersección no vacía.
Ver también las colecciones de Apache Commons.
Puede usar el método retainAll y obtener la intersección de sus dos conjuntos.
Recomendaría crear un HashMap desde el conjunto A, y luego iterar a través del conjunto B y verificar si algún elemento de B está en A. Esto se ejecutaría en tiempo O(|A|+|B|) (ya que no habría colisiones) , mientras retainAll(Collection<?> c) debe ejecutarse en tiempo O(|A|*|B|) .
Una buena manera de implementar Sets.intersection() para todos los conjuntos es usar Guava Sets.intersection() .
containsAny devolvería un boolean , por lo que la llamada parece:
Sets.intersection(set1, set2).isEmpty()
Esto devuelve verdadero si los conjuntos son disjuntos, de lo contrario falso. La complejidad del tiempo de esto es probablemente un poco mejor que retenerAll porque no tiene que hacer ninguna clonación para evitar modificar su conjunto original.
Utilice retainAll() en la interfaz Set. Este método proporciona una intersección de elementos comunes en ambos conjuntos. Consulte la documentación de la API para obtener más información.
Yo uso org.apache.commons.collections.CollectionUtils
CollectionUtils.containsAny(someCollection1, someCollection2)
¡Eso es todo! Devuelve verdadero si al menos un elemento está en ambas colecciones.
Fácil de usar, y el nombre de la función es más sugestivo.