Lo intento con un bucle como ese
// ArrayList tourists
for (Tourist t : tourists) {
if (t != null) {
t.setId(idForm);
}
}
Pero no es lindo. ¿Alguien puede sugerirme una mejor solución?
Algunos puntos de referencia útiles para tomar una mejor decisión:
Iterator
? Excavar java-doc. download.oracle.com/javase/6/docs/api/java/util/…Respuestas:
Tratar:
Lea la API de Java . El código se lanzará
java.lang.UnsupportedOperationException
para listas inmutables (como las creadas conArrays.asList
); Vea esta respuesta para más detalles.fuente
List.removeAll()
es n ^ 2 . Solo digo.O(n)
para ambosArrayList
yLinkedList
.contains()
recorre toda la matriz) y dado quesingleton
es solo un elemento, seríaN * 1 = N
. Sin embargo, en general lo seríaN^2
.A partir de 2015, esta es la mejor manera (Java 8):
Nota: Este código arrojará
java.lang.UnsupportedOperationException
para listas de tamaño fijo (como las creadas con Arrays.asList), incluidas las listas inmutables.fuente
removeIf
más rápido, pero es una suposición.Arrays.asList
No es inmutable . Es de tamaño fijo.fuente
No eficiente, pero corto
fuente
Si prefiere objetos de datos inmutables, o si simplemente no desea ser destructivo para la lista de entrada, puede usar los predicados de Guava.
fuente
fuente
removeAll(..null..)
. ¡Gracias!Pre-Java 8 debe usar:
Uso posterior a Java 8:
La razón aquí es la complejidad del tiempo. El problema con las matrices es que una operación de eliminación puede tardar O (n) en completarse. Realmente en Java, esta es una copia de matriz de los elementos restantes que se mueven para reemplazar el espacio vacío. Muchas otras soluciones que se ofrecen aquí desencadenarán este problema. El primero es técnicamente O (n * m) donde m es 1 porque es un singleton nulo: entonces O (n)
Debe eliminar All of the singleton, internamente hace un batchRemove () que tiene una posición de lectura y una posición de escritura. E itera la lista. Cuando llega a un valor nulo, simplemente itera la posición de lectura en 1. Cuando son lo mismo que pasa, cuando son diferentes, se sigue moviendo copiando los valores. Luego, al final, se ajusta al tamaño.
Efectivamente hace esto internamente:
Lo que puede ver explícitamente es una operación O (n).
Lo único que podría ser más rápido es si itera la lista desde ambos extremos, y cuando encuentra un valor nulo, establece su valor igual al valor que encontró al final y disminuye ese valor. E iterado hasta que los dos valores coinciden. Arruinaría el orden, pero reduciría enormemente la cantidad de valores que establezca frente a los que dejó solo. Es un buen método para saber, pero no ayudará mucho aquí, ya que .set () es básicamente gratuito, pero esa forma de eliminar es una herramienta útil para su cinturón.
Si bien esto parece bastante razonable, el .remove () en el iterador llama internamente:
Que es nuevamente la operación O (n) dentro de la eliminación. Hace un System.arraycopy () que nuevamente no es lo que quieres, si te importa la velocidad. Esto lo hace n ^ 2.
También hay:
Que es O (m * n ^ 2). Aquí no solo iteramos la lista. Reiteramos toda la lista, cada vez que hacemos coincidir el nulo. Luego hacemos n / 2 (promedio) operaciones para hacer System.arraycopy () para realizar la eliminación. Literalmente, podría ordenar toda la colección entre elementos con valores y elementos con valores nulos y recortar el final en menos tiempo. De hecho, eso es cierto para todos los rotos. Al menos en teoría, el system.arraycopy real no es en realidad una operación N en la práctica. En teoría, teoría y práctica son lo mismo; en la práctica no lo son.
fuente
Hay una manera fácil de eliminar todos los
null
valores decollection
. Debe pasar una colección que contenga nulo como parámetro alremoveAll()
métodofuente
La
Objects
clase tiene una con lanonNull
Predicate
que se puede usarfilter
.Por ejemplo:
fuente
Usando Java 8, puedes hacer esto usando
stream()
yfilter()
o
Para más información: Java 8 - Streams
fuente
Esta es una manera fácil de eliminar los valores nulos predeterminados de la lista de arrays
de lo contrario, el valor de cadena "nulo" se eliminará de la lista de arrays
fuente
Jugué con esto y descubrí que trimToSize () parece funcionar. Estoy trabajando en la plataforma Android, por lo que podría ser diferente.
fuente
trimToSize
no modifica los contenidos de aArrayList
. Si esto es diferente en Android, probablemente sea un error.Podemos usar el iterador para lo mismo para eliminar todos los valores nulos.
fuente
Utilicé la interfaz de flujo junto con la operación de flujo por cobrar y un método auxiliar para generar una nueva lista.
fuente
tourists.stream().filter(s -> s != null).collect(Collectors.toList());
Principalmente estoy usando esto:
Pero después de aprender Java 8, cambié a esto:
fuente
Usando Java 8 esto se puede realizar de varias maneras usando flujos, flujos paralelos y
removeIf
método:El flujo paralelo hará uso de los procesadores disponibles y acelerará el proceso para listas de tamaño razonable. Siempre es recomendable realizar una evaluación comparativa antes de usar transmisiones.
fuente
Similar a la respuesta @Lithium pero no arroja un error "La lista no puede contener tipo nulo":
fuente
fuente