Как удалить все нулевые элементы из ArrayList или String Array? - PullRequest
174 голосов
/ 27 января 2011

Я пытаюсь с такой петлей

// ArrayList tourists

for (Tourist t : tourists) {
    if (t != null) {     
        t.setId(idForm); 
    }   
}

Но это нехорошо. Кто-нибудь может предложить мне лучшее решение?


Некоторые полезные ориентиры для принятия лучшего решения:

Пока цикл, для цикла и теста производительности итератора

Ответы [ 17 ]

2 голосов
/ 18 февраля 2014

Это простой способ удалить пустые значения по умолчанию из массива

     tourists.removeAll(Arrays.asList(null));  

, в противном случае строковое значение "null" удалить из массива

       tourists.removeAll(Arrays.asList("null"));  
1 голос
/ 29 октября 2015

Я использовал интерфейс потока вместе с операцией потока collect и вспомогательным методом для создания нового списка.

tourists.stream().filter(this::isNotNull).collect(Collectors.toList());

private <T> boolean isNotNull(final T item) {
    return  item != null;
}
1 голос
/ 19 мая 2011

Я поиграл с этим и обнаружил, что trimToSize (), кажется, работает. Я работаю на платформе Android, поэтому она может отличаться.

1 голос
/ 16 мая 2015

Мы можем использовать итератор для того же самого, чтобы удалить все нулевые значения.

Iterator<Tourist> itr= tourists.iterator();
while(itr.hasNext()){
    if(itr.next() == null){
        itr.remove();
    }
}
0 голосов
/ 19 декабря 2017

Аналогично ответу @Lithium, но не выдает ошибку «Список может не содержать тип null»:

   list.removeAll(Collections.<T>singleton(null));
0 голосов
/ 12 ноября 2018
List<String> colors = new ArrayList<>(
Arrays.asList("RED", null, "BLUE", null, "GREEN"));
// using removeIf() + Objects.isNull()
colors.removeIf(Objects::isNull);
0 голосов
/ 15 октября 2017

Используя Java 8 , это может быть выполнено различными способами с использованием потоков, параллельных потоков и метода removeIf:

List<String> stringList = new ArrayList<>(Arrays.asList(null, "A", "B", null, "C", null));
List<String> listWithoutNulls1 = stringList.stream()
                .filter(Objects::nonNull)
                .collect(Collectors.toList()); //[A,B,C]
List<String> listWithoutNulls2 = stringList.parallelStream()
                .filter(Objects::nonNull)
                .collect(Collectors.toList()); //[A,B,C]
stringList.removeIf(Objects::isNull); //[A,B,C]

Параллельный поток будет использовать доступные процессоры и будетускорить процесс для разумных размеров списков.Перед использованием потоков рекомендуется всегда проводить сравнительный анализ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...