Подтвердить что ты не робот

В Java удалите пустые элементы из списка строк

В Java у меня есть ArrayList строк, например:

[,Hi, ,How,are,you]

Я хочу удалить пустые и пустые элементы, как изменить его так:

[Hi,How,are,you]
4b9b3361

Ответ 1

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

Вывод:

[, Hi, null, How]
[Hi, How]

Ответ 2

Это очень поздний ответ, но вы также можете использовать Collections.singleton:

List<String> list = new ArrayList<String>(Arrays.asList("", "Hi", null, "How"));
list.removeAll(Collections.singleton(null));
list.removeAll(Collections.singleton(""));

Ответ 3

Другой способ сделать это сейчас, когда у нас есть лямбда-выражения Java 8.

arrayList.removeIf(item -> item == null || "".equals(item));

Ответ 4

  • Если вы спрашивали, как удалить пустые строки, вы можете сделать это так (где l - ArrayList<String>) - это удаляет все ссылки null и строки длиной 0:

    Iterator<String> i = l.iterator();
    while (i.hasNext())
    {
        String s = i.next();
        if (s == null || s.isEmpty())
        {
            i.remove();
        }
    }
    
  • Не путайте ArrayList с массивами, ArrayList - это динамическая структура данных, которая изменяет размер в соответствии с содержимым. Если вы используете приведенный выше код, вам не нужно ничего делать, чтобы получить результат, как вы его описали, - если ваш ArrayList был [ "," Привет", "," Как ",", "вы" ], после удаления, как указано выше, это будет именно то, что вам нужно - ["Hi","How","are","you"].

    Однако, если у вас должна быть "очищенная" копия исходного списка (при оставлении оригинала как есть) и "сохранить его обратно" вы имели в виду "сделать копию", тогда krmby код в другом ответе будет вам просто отлично.

Ответ 5

Существует несколько подходов, которые вы можете использовать:

  • Перейдите по списку, вызвав Iterator.remove() для элементов списка, которые вы хотите удалить. Это самый простой.

  • Повторно называть List.remove(Object). Это тоже очень просто, но хуже всего работает... потому что вы повторно просматриваете весь список. (Однако это может быть вариант для изменяемого списка, итератор которого по умолчанию не поддерживал remove...)

  • Создайте новый список, перейдите по старому списку, добавив элементы, которые вы хотите сохранить, в новый список.

  • Если вы не можете вернуть новый список, как 3. выше, а затем очистить старый список и использовать addAll, чтобы добавить к нему элементы нового списка.

Какой из них наиболее быстрый, зависит от класса исходного списка, его размера и количества элементов, которые необходимо удалить. Вот некоторые из факторов:

  • Для ArrayList каждая отдельная операция remove O(N), где N - размер списка. Очень дорого удалить несколько элементов из большого массива ArrayList с помощью метода Iterator.remove() (или метода ArrayList.remove(element)).

    В отличие от этого метод Iterator.remove для a LinkedList равен O(1).

  • Для ArrayList создание и копирование списка O(N) и относительно дешевое, особенно если вы можете убедиться, что емкость списка адресатов достаточно большая (но не слишком большая).

    В отличие от этого, создание и копирование на LinkedList также O(N), но значительно более дорогостоящее.

Все это добавляет довольно сложное дерево решений. Если списки небольшие (например, 10 или менее элементов), вы, вероятно, можете уйти с любым из вышеперечисленных подходов. Если списки могут быть большими, вам нужно взвесить все проблемы в списке ожидаемого размера списка и ожидаемого количества абзацев. (В противном случае вы можете получить квадратичную производительность.)

Ответ 6

  • Этот код компилируется и работает плавно.
  • Он не использует итератор для чтения.
  • список - это ваша коллекция.
  • результат отфильтрован (no null no empty).

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);
}

Ответ 7

Собираемся отбросить этот lil nugget здесь:

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

Я хочу от всей души сказать, что Java имеет filterNot.

Ответ 8

Если вы получите UnsupportedOperationException от использования одного из ответов выше, и ваш List создан из Arrays.asList(), это связано с тем, что вы не можете редактировать такой List.

Чтобы исправить, заверните Arrays.asList() внутри new LinkedList<String>():

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

Источник из этого ответа.

Ответ 9

Что касается комментария Эндрю Маироуза - Хотя это прекрасное решение, я хотел бы добавить, что это решение не будет работать с фиксированными размерами.

Вы можете сделать так:

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

Но вы столкнетесь с UnsupportedOperationException at java.util.AbstractList.remove (так как asList возвращает список без изменений).

Другим решением может быть следующее:

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

Будет создан отличный список строк: -)

Ответ 10

Если вы используете Java 8, то попробуйте это с помощью лямбда - выражения и org.apache.commons.lang.StringUtils, что также будет ясно, null и blank значения из array ввода

public static String[] cleanArray(String[] array) {
    return Arrays.stream(array).filter(x -> !StringUtils.isBlank(x)).toArray(String[]::new);
}

ref - fooobar.com/questions/13157704/...

Ответ 11

   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;
    }