2011-12-19 29 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); 

Tengo una lista que contiene elementos nulos. ¿Hay alguna manera de eliminar null elementos de la colección actual sin usar ninguna iteración?Eliminar elementos nulos de la lista

+5

Sin que escribir ningún iteraciones, o por lo ¿todas? http://stackoverflow.com/questions/4819635/how-to-remove-all-null-elements-from-a-arraylist – LuckyLuke

Respuesta

48

Esto debería funcionar:

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

Buen truco. Realmente funciona. – AlexR

+0

La complejidad de tiempo de 'List.removeAll()' es ** n^2 **. Solo digo. – Hemanth

+0

@Hermanth ¿No sería la complejidad 'n * m' con' m == 1' para ese singleton? – kratenko

5

Extender ArrayList y anular add() & addAll() método y simplemente no permitir que null

o puede utilizar list.removeAll(null); como se muestra here Qué itera el bucle interno

+5

No me gusta extender dichas clases, ya que podría dar lugar a código confuso. También debe tener en cuenta que también puede agregar elementos a la lista con un [ListIterator] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/ListIterator.html#add % 28java.lang.Object% 29) – Kai

3

echar un vistazo en LambdaJ que permite para manipular colecciones "sin" bucles. En realidad, los bucles se implementan dentro de la biblioteca, pero es realmente genial y simplifica el código y lo hace más corto.

+0

+1 para nueva información –

0

Si usted está construyendo la lista sí mismo y no está seguro de si el valor es nulo o no también se puede utilizar CollectionUtils.addIgnoreNull(list,elementToAdd); Esto evitará elementos nulos se agreguen. Esto solo funciona al construir la lista. Si está recibiendo la lista de otro lugar y desea eliminar todos los elementos no nulos antes de usar la lista, entonces el list.removeAll(Collections.singleton(null)); será mejor

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--){ 

Es un orden ascendente, lo que será el fin de este problema descendente ?

+0

Las preguntas se deben hacer en un hilo separado. [Haga clic aquí] (http://stackoverflow.com/questions/ask) si desea hacer su pregunta. Responder una pregunta significa responder una pregunta, no hacer otra pregunta más. –

2

no es eficiente, pero las obras

while(list.remove(null));

0

Usando 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); 
     } 
    })); 
} 
Cuestiones relacionadas