En Java, tengo un ArrayList de Cadenas como:

[,Hi, ,How,are,you]

Quiero quitar el nulo y vacío de elementos, cómo cambiar y es como este:

[Hi,How,are,you]

11 Comentarios

  1. 83
    List<String> list = new ArrayList<String>(Arrays.asList("", "Hi", null, "How"));
    System.out.println(list);
    list.removeAll(Arrays.asList("", null));
    System.out.println(list);

    De salida:

    [, Hi, null, How]
    [Hi, How]
    • Me da UnsupportedOperationException de java.util.AbstractList.remove()
    • Hice copia y pega este código?
    • Maldita sea, he re-hecho y funciona. Mi mal. Sinceramente.
    • Qué necesitamos para importar desde el util o awt de la biblioteca?
    • Hay una manera de convertir la lista en una matriz? Y podemos mantener el mismo número de posiciones en la matriz como antes? Se acaba de mover todos los espacios vacíos para el final?
    • dicen que Google es tu amigo – google.com/search?q=arraylist+para+matriz
    • da UnsupportedOperationException, no estoy seguro de cómo es trabajar para otros?
    • ¿copiar y pegar el código?

  2. 40

    Su muy tardía respuesta, pero usted también puede usar el Collections.singleton:

    List<String> list = new ArrayList<String>(Arrays.asList("", "Hi", null, "How"));
    list.removeAll(Collections.singleton(null));
    list.removeAll(Collections.singleton(""));
    • da UnsupportedOperationException, no estoy seguro de cómo es trabajar para otros
    • Si no envoltura de las Matrices.asList con new ArrayList<Cadena>, entonces se daría UnsupportedOperationException. Debido A Que Las Matrices.asList no puede ser modificado estructuralmente, por lo que removeIf la operación no puede realizarse.
  3. 16

    Otra manera de hacer esto ahora que tenemos Java 8 de expresiones lambda.

    arrayList.removeIf(item -> item == null || "".equals(item));
    • Con la Guayaba puede hacer arrayList.removeIf(Strings::isNullOrEmpty);.
    • O con Apache Commons arrayList.removeIf(StringUtils::isEmpty);
    • O si desea eliminar las entradas que no son sino caracteres de espacio en blanco así arrayList.removeIf(StringUtils::isBlank);
    • Por cierto, no hay ningún punto en el uso de yoda comparación una vez usted está comprobando el valor null.
  4. 7
    1. Si estaban pidiendo cómo para quitar las cadenas vacías, usted puede hacerlo como este (donde l es un ArrayList<String>) – esto elimina todos los null referencias y cadenas de longitud 0:

      Iterator<String> i = l.iterator();
      while (i.hasNext())
      {
          String s = i.next();
          if (s == null || s.isEmpty())
          {
              i.remove();
          }
      }
    2. No hay que confundir un ArrayList con matrices, una ArrayList es una dinámica de la estructura de datos que cambia de tamaño según su contenido. Si utiliza el código de arriba, usted no tiene que hacer nada para obtener el resultado como lo has descrito -si su ArrayList fue [«»,»Hola»,»»,»Cómo»,»son»,»usted»], después de la extracción como en el anterior, va a ser exactamente lo que usted necesita – ["Hi","How","are","you"].

      Sin embargo, si usted debe tener un ‘desinfectar’ copia de la lista original (dejando el original tal como es) y por el » de la tienda de nuevo‘ que significaba ‘hacer una copia‘, entonces krmby del código en la otra respuesta le servirá bien.

    • hay sin cero-arg mágico método remove en arratlist como usted menciona.
    • Por favor, tomar una mirada más cercana – la remove() se invoca en un Iterator no en un ArrayList
    • de tus respuesta si usted ha llamado remove() en el ArrayList
    • Lo que puedes hacer es llamar a quitar(«») si sólo desea eliminar todas las cadenas vacías. Que no trabajan para las cadenas con sólo espacios en blanco, aunque.
    • Editado, gracias. @squaknull Limpio, no pensar en que (aunque usted todavía tiene que hacerlo en un bucle). Y depende de lo que el OP que significa «vacío» – yo lo he puesto en una advertencia que indica que este bucle se retire todos los null y cadenas vacías sólo.
  5. 5

    Hay algunos enfoques que puede utilizar:

    1. Iterar sobre la lista de llamadas Iterator.remove() para los elementos de la lista que desea eliminar. Este es el más simple.

    2. Llamar varias veces a List.remove(Object). Esto es simple, pero realiza lo peor de todo … porque repetidamente escanear el toda la lista. (Sin embargo, esto podría ser una opción para un mutable lista cuyos iterador no apoyo remove … por alguna razón.)

    3. Crear una nueva lista, iterar sobre la lista anterior, la adición de elementos que desea conservar a una nueva lista.

    4. Si usted no puede devolver la lista de nuevo, como 3. arriba y, a continuación, desactive la lista anterior y el uso addAll para agregar los elementos de la lista de nuevo de vuelta a él.

    Cual de estos es el más rápido depende de la clase de la lista original, su tamaño, y el número de elementos que deben ser eliminados. Aquí están algunos de los factores:

    • Para un ArrayList, cada individuo remove operación es O(N), donde N es el tamaño de la lista. Es caro para eliminar varios elementos a partir de una gran ArrayList utilizando el Iterator.remove() método (o el ArrayList.remove(element) método).

      Por el contrario, la Iterator.remove método para un LinkedList es O(1).

    • Para un ArrayList, crear y copiar una lista O(N) y relativamente barato, especialmente si usted puede asegurarse de que el destino de la lista de capacidad es lo suficientemente grande (pero no demasiado grande).

      Por el contrario, crear y copiar a un LinkedList es también O(N), pero bastante más caro.

    Todo esto se suma a un complicado árbol de decisión. Si las listas son pequeños (digamos 10 o menos elementos) probablemente, usted puede conseguir lejos con ninguno de los enfoques anteriores. Si las listas podrían ser grandes, tienen que considerar todos los temas en la lista de espera lista de tamaño y número esperado de retiros. (De lo contrario podría terminar con cuadrática de rendimiento.)

  6. 4

    Va a caer este lil pepita aquí:

    Stream.of("", "Hi", null, "How", "are", "you")
      .filter(t -> !Strings.isNullOrEmpty(t))
      .collect(ImmutableList.toImmutableList());

    Deseo con todo mi corazón que Java tuvo un filterNot.

  7. 3
    • Este código se compila y se ejecuta sin problemas.
    • No usa el iterador de manera más legible.
    • lista de tu colección.
    • resultado se filtra de forma (no null no vacío).

    public static void listRemove() {
        List<String> list = Arrays.asList("", "Hi", "", "How", "are", "you");
        List<String> result = new ArrayList<String>();
    
        for (String str : list) {
            if (str != null && !str.isEmpty()) {
                result.add(str);
            }
        }
    
        System.out.println(result);
    }
    • Este puede lanzar una java.lang.NullPointerException desde str podría ser null.
  8. 2

    Si usted consigue UnsupportedOperationException desde el uso de una de sus respuesta anterior y su List se crea a partir de Arrays.asList(), es porque usted no puede editar List.

    A revisión, ajuste el Arrays.asList() dentro de new LinkedList<String>():

        List<String> list = new LinkedList<String>(Arrays.asList(split));

    De origen es a partir de este respuesta.

  9. 1

    Con respecto a el comentario de Andrew Mairose – Aunque una multa solución, me gustaría añadir que esta solución no va a trabajar en tamaño fijo listas.

    Que podría intentar hacer así:

    Arrays.asList(new String[]{"a", "b", null, "c", "    "})
        .removeIf(item -> item == null || "".equals(item));

    Pero te vas a encontrar un UnsupportedOperationException at java.util.AbstractList.remove(desde asList devuelve un no puede cambiar de tamaño de la Lista).

    Una solución diferente podría ser este:

    List<String> collect =
        Stream.of(new String[]{"a", "b", "c", null, ""})
            .filter(item -> item != null && !"".equals(item))
            .collect(Collectors.toList());

    Que va a producir una buena lista de cadenas de caracteres 🙂

    • Buen punto, pero el OP dijo que era un ArrayList, que no es de tamaño fijo.
  10. 0
       private List cleanInputs(String[] inputArray) {
            List<String> result = new ArrayList<String>(inputArray.length);
            for (String input : inputArray) {
                if (input != null) {
                    String str = input.trim();
                    if (!str.isEmpty()) {
                        result.add(str);
                    }
                }
            }
            return result;
        }

Dejar respuesta

Please enter your comment!
Please enter your name here