2011-12-19 4 views
22
List<String> list = new ArrayList<String>(); 
    list.add("One"); 
    list.add(null); 
    list.add("Two!"); 
    list.add(null); 
    list.add("Three"); 
    list.add(null); 
    list.add("Four"); 
    list.add(null); 

У меня есть список, содержащий null элементов. Есть ли способ удалить нулевые элементов из текущей коллекции без каких-либо итераций?Удалить null элементов из списка

+5

Без вас писать какие-либо итерации, или все? http://stackoverflow.com/questions/4819635/how-to-remove-all-null-elements-from-a-arraylist – LuckyLuke

ответ

48

Это должно работать:

list.removeAll(Collections.singleton(null)); 
+0

Хороший трюк. Это действительно работает. – AlexR

+0

Сложность времени 'List.removeAll()' is ** n^2 **. Просто говорю. – Hemanth

+0

@ Hermanth Не будет ли сложность 'n * m' с' m == 1' для этого синглтона? – kratenko

5

Продлить ArrayList и переопределить add() & addAll() метод и просто не позволяют null

или вы могли бы использовать list.removeAll(null);, как показано here Что внутри итерацию цикла

+5

Мне не нравится расширять такие классы, поскольку это может привести к запутыванию кода. Вы также должны иметь в виду, что вы также можете добавлять элементы в список с помощью [ListIterator] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/ListIterator.html#add % 28java.lang.Object% 29) – Kai

3

Взгляните на LambdaJ, который позволяет для управления наборами «без» циклов. На самом деле петли реализованы внутри библиотеки, но это действительно здорово, и это упрощает ваш код и делает его короче.

+0

+1 для новой информации –

0

Если вы строите список по себе и не уверен, что если значение равно нулю или нет вы можете также использовать CollectionUtils.addIgnoreNull(list,elementToAdd); Это предотвратит нулевые элементы добавляются. Это работает только при построении списка. Если вы получаете список где-то еще и хотите удалить все ненулевые элементы перед использованием списка, то list.removeAll(Collections.singleton(null)); будет лучше

0
for (int i = 0; i <array.size(); i++) { 
    for (int j = 0; j < array.size()-i-1; j++) { 
     if (array.get(j) > array.get(j+i)){ 
      Integer t = array.get(j+i); 
      array.set(j+i,array.get(j)); 
      array.set(j,t); 
     } 
    } 
} 

for(int i = array.size()-1; i >= 0; i--){ 

Сво порядок возрастания, что будет порядок убывания этой проблемы ?

+0

Вопросы следует задавать по отдельной теме. [Нажмите здесь] (http://stackoverflow.com/questions/ask), если вы хотите задать свой вопрос. Ответ на вопрос означает ответ на вопрос, а не задающий еще один вопрос. –

2

не эффективен, но работает

while(list.remove(null));

0

Использование google.common.:

import com.google.common.collect.Iterables; 
import com.google.common.collect.Lists; 

public List<String> removeBlanks(List<String> list) { 
    return Lists.newArrayList(Iterables.filter(list, new Predicate<String>() { 

     @Override 
     public boolean apply(String arg) { 
      return StringUtils.isNotEmpty(arg); 
     } 
    })); 
} 
Смежные вопросы