¿Hay algún método para hacerlo? Estaba buscando pero no pude encontrar ninguno.
Otra pregunta: necesito estos métodos para poder filtrar archivos. Algunos son AND
filtros y otros son OR
filtros (como en la teoría de conjuntos), por lo que necesito filtrar de acuerdo con todos los archivos y las ArrayLists de unión / intersección que contienen esos archivos.
¿Debo usar una estructura de datos diferente para guardar los archivos? ¿Hay algo más que ofrezca un mejor tiempo de ejecución?
java
list
union
intersection
yotamoo
fuente
fuente
Vector
? Esa clase ha sido desalentada desde Java 1.2.Vector
es para interacciones entre hilos, pero también hay estructuras de datos más seguras para esos casos de uso. Ver también esta pregunta . Cualquier biblioteca que todavía useVector
en 2016 es muy sospechosa en mi opinión.Respuestas:
Aquí hay una implementación simple sin usar ninguna biblioteca de terceros. Principal ventaja sobre
retainAll
,removeAll
yaddAll
es que estos métodos no modifican la entrada de las listas originales de los métodos.fuente
HashSet
forintersection
para que el rendimiento promedio del caso sea O (n) en lugar de O (n ^ 2).La colección (también ArrayList) tiene:
Use una implementación de Lista si acepta repeticiones, una Implementación de conjunto si no:
fuente
HashSet
en su lugar.addAll()
es la unión para las listas; solo concatena la segunda lista al final de la primera. Una operación de unión evitaría agregar un elemento si la primera lista ya lo contiene.Esta publicación es bastante antigua, pero sin embargo fue la primera que apareció en Google al buscar ese tema.
Quiero dar una actualización usando flujos Java 8 haciendo (básicamente) lo mismo en una sola línea:
Si alguien tiene una solución mejor / más rápida, avíseme, pero esta solución es un buen revestimiento que se puede incluir fácilmente en un método sin agregar una clase / método auxiliar innecesario y aún así mantener la legibilidad.
fuente
Set
luego use elcontains
método del conjunto . No todo en la vida tiene que hacerse con corrientes.la unión será
removeAll
y luegoaddAll
.Encuentre más en la documentación de la colección (ArrayList es una colección) http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html
fuente
retainAll()
yremoveAll()
son operaciones O (n ^ 2) en listas. Podemos hacerlo mejor.retainAll
de {1, 2, 2, 3, 4, 5} sobre {1, 2, 3} da como resultado {1, 2, 2, 3}. ¿No debería ser {1, 2, 3} ser la intersección?Uniones e intersecciones definidas solo para conjuntos, no para listas. Como lo mencionaste.
Verifique la biblioteca de guayaba para ver los filtros. También la guayaba proporciona intersecciones y sindicatos reales.
fuente
Puedes usar
CollectionUtils
desde apache commons .fuente
La solución marcada no es eficiente. Tiene una complejidad de tiempo O (n ^ 2). Lo que podemos hacer es ordenar ambas listas y ejecutar un algoritmo de intersección como el siguiente.
Este tiene una complejidad de O (n log n + n) que está en O (n log n). La unión se realiza de manera similar. Solo asegúrese de realizar las modificaciones adecuadas en las declaraciones if-elseif-else.
También puede usar iteradores si lo desea (sé que son más eficientes en C ++, no sé si esto también es cierto en Java).
fuente
contains()
en un bucle (como sugiere Devenv) llevaría tiempo O (n + m). La clasificación es innecesariamente complicada y lleva tiempo O (n log n + m log n + n). De acuerdo, eso reduce el tiempo de O (n log n), pero aún es peor que el tiempo lineal, y mucho más complejo.Creo que debería usar a
Set
para guardar los archivos si desea hacer intersección y unión en ellos. A continuación, puede utilizar la guayaba 's conjuntos de clase para hacerunion
,intersection
y filtrar por unaPredicate
así. La diferencia entre estos métodos y las otras sugerencias es que todos estos métodos crean vistas perezosas de la unión, intersección, etc. de los dos conjuntos. Apache Commons crea una nueva colección y le copia datos.retainAll
cambia una de tus colecciones eliminando elementos de ella.fuente
Aquí hay una manera de cómo puedes hacer una intersección con las transmisiones (recuerda que debes usar Java 8 para las transmisiones):
Un ejemplo para listas con diferentes tipos. Si tiene una relación entre foo y bar y puede obtener un objeto de barra de foo que puede modificar su transmisión:
fuente
Encontré ListUtils muy útil para este caso de uso.
Utilice ListUtils de org.apache.commons.collections si no desea modificar la lista existente.
ListUtils.intersection(list1, list2)
fuente
Puede usar commons-collections4 CollectionUtils
fuente
En Java 8, uso métodos de ayuda simples como este:
fuente
Si los objetos de la lista son hashable (es decir, tienen un hashCode decente y una función igual), el enfoque más rápido entre tablas aprox. size> 20 es construir un HashSet para la mayor de las dos listas.
fuente
También estaba trabajando en una situación similar y llegué aquí buscando ayuda. Terminé encontrando mi propia solución para matrices. ArrayList AbsentDates = new ArrayList (); // Almacenará Array1-Array2
Nota: Publicar esto si puede ayudar a alguien que llega a esta página para obtener ayuda.
fuente
Intersección de dos listas de diferentes objetos basados en clave común - Java 8
fuente
JDK8 + (Probablemente el mejor rendimiento)
Si no le importa el rendimiento y prefiere un código más pequeño, simplemente use:
fuente
Solución final:
fuente
Primero, estoy copiando todos los valores de las matrices en una sola matriz, luego estoy eliminando valores duplicados en la matriz. Línea 12, explicando si el mismo número ocurre más de tiempo, luego coloque algún valor de basura adicional en la posición "j". Al final, atraviese desde el inicio hasta el final y verifique si se produce el mismo valor de basura, luego deséchelo.
fuente
ArrayList
, para almacenar el resultado de la unión.Integer
lugar deint
. Luego puede usar ennull
lugar de su "valor de basura". Los "valores basura" o los "valores centinela" suelen ser una mala idea, ya que estos valores aún pueden aparecer en la entrada.Después de la prueba, aquí está mi mejor enfoque de intersección.
Velocidad más rápida en comparación con el enfoque puro de HashSet. HashSet y HashMap a continuación tienen un rendimiento similar para matrices con más de 1 millón de registros.
En cuanto al enfoque de Java 8 Stream, la velocidad es bastante lenta para un tamaño de matriz mayor de 10k.
Espero que esto pueda ayudar.
fuente
Retención de todo el método () para encontrar elementos comunes ... es decir, intersección list1.retainAll (list2)
fuente
Si tuviera sus datos en Conjuntos, podría usar la
Sets
clase Guava .fuente
Si el número coincide con el que estoy comprobando, se produce por primera vez o no con la ayuda de "indexOf ()" si el número coincide por primera vez, luego imprime y guarda en una cadena para que la próxima vez que coincida el mismo número se gane ' t imprimir porque debido a la condición "indexOf ()" será falso.
}
fuente