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

Mam listę zawierającą elementy null. Czy istnieje sposób na usunięcie elementów z bieżącej kolekcji bez użycia żadnych iteracji?Usuwanie elementów pustych z listy

+5

Bez piszesz żadnych powtórzeń, lub wszystko? http://stackoverflow.com/questions/4819635/how-to-remove-all-null-elements- from-a-arraylist – LuckyLuke

Odpowiedz

48

To powinno działać:

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

Dobra sztuczka. To naprawdę działa. – AlexR

+0

Złożoność czasowa 'List.removeAll()' wynosi ** n^2 **. Tylko mówię. – Hemanth

+0

@Hermanth Czyżby złożoność nie była "n * m" z 'm == 1' dla tego singletonu? – kratenko

5

Extend ArrayList i zastąpić add() & addAll() metodę i po prostu nie pozwalają null

lub można użyć list.removeAll(null); jak pokazano here Która wewnętrznie iteracje pętli

+5

Nie lubię rozszerzać takich klas, ponieważ może to prowadzić do mylenia kodu. Należy również pamiętać, że można również dodawać elementy do listy za pomocą [ListIterator] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/ListIterator.html#add % 28java.lang.Object% 29) – Kai

3

spojrzeć na LambdaJ który pozwala manipulować kolekcjami "bez" pętli. W rzeczywistości pętle są zaimplementowane wewnątrz biblioteki, ale naprawdę fajne i upraszczają kod i skracają go.

+0

+1 dla nowych informacji –

0

Jeśli Tworzenie listy siebie i nie wiem, czy wartość jest null lub nie można również użyć CollectionUtils.addIgnoreNull(list,elementToAdd); Pozwoli to uniknąć pustych elementów z dodawane. Działa to tylko podczas konstruowania listy. Jeśli otrzymujesz listę gdzieś indziej i chcesz usunąć wszystkie elementy non-zerowe przed użyciem listy, a następnie list.removeAll(Collections.singleton(null)); będzie najlepiej

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

Jego porządku rosnącym, co będzie kolejność tym problemem malejącej ?

+0

Pytania należy zadawać w oddzielnym wątku. [Kliknij tutaj] (http://stackoverflow.com/questions/ask), jeśli chcesz zadać pytanie. Odpowiedź na pytanie oznacza odpowiedź na pytanie, a nie zadawanie kolejnego pytania. –

2

nie skuteczne, ale działa

while(list.remove(null));

0

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