2015-07-03 3 views
11

Я искал это, но он находится на других языках, таких как Python или R (?). У меня есть списки внутри списка, и я хотел бы удалить пустой список. Например:Как удалить пустой список из списка (Java)

[[азбука, Защиту], [GHI], [], [], [JKL, MnO]]

Я хотел бы:

[ [abc, def], [ghi], [jkl, mno]]

Как удалить пустой список из списка? Спасибо!

+1

Я бы попробовал 'list.removeAll (новый ArrayList());' – Kon

+0

@Kon nope это не сработало – sw2

+0

Почему null или "" совпадают с пустым списком? У вас, кажется, очень странное и неправильное представление о том, что здесь происходит. –

ответ

24

Вы могли бы попробовать это так:

list.removeIf(p -> p.isEmpty()); 
+4

Это гораздо лучший выбор, чем принятый ответ, гораздо более очевидно, что это за намерение. –

+3

Однако, если у вас есть это [http: // stackoverflow.com/a/31196977/4086836], этот ответ вернет NullPointerException – Andrei

+2

Может также быть написано следующим образом: 'list.removeIf (List :: isEmpty);' – Lii

12

Вы могли бы использовать:

list.removeAll(Collections.singleton(new ArrayList<>())); 
+8

Можете ли вы пойти немного подробнее и объяснить, что там происходит? – Andrei

+2

или '.removeAll (Collections.singleton (Collections.emptyList())' – blgt

11
list.removeAll(Collections.singleton(new ArrayList<>())); 

Код выше работает отлично подходит для многих случаев, но это зависит от равна реализация методы списка в списке, поэтому, если у вас что-то похожее на код ниже, он потерпит неудачу.

public class AnotherList extends ArrayList<String> { 
    @Override 
    public boolean equals(Object o) { 
     return o instanceof AnotherList && super.equals(o); 
    } 
} 

List<List<String>> list = new ArrayList<>(); 
list.add(Arrays.asList("abc", "def")); 
list.add(Arrays.asList("ghi")); 
list.add(new ArrayList<String>()); 
list.add(new ArrayList<String>()); 
list.add(new AnotherList()); 
list.add(null); 
list.add(Arrays.asList("jkl", "mno")); 

Решение состоит в том:

list.removeIf(x -> x != null && x.isEmpty()); 

Если вы не беспокоиться о другом осуществлении составляет метод, вы можете использовать другое решение.

+2

Контракт 'java.util.List' фактически указывает точное поведение «равно», чтобы гарантировать, что эта проблема не возникает. Конечно, этот аспект контракта не может быть применен компилятором, тем не менее проблема в вашем примере заключается в том, что 'AnotherList' нарушает [подстановку Лискова принцип] (https://en.wikipedia.org/wiki/Liskov_substitution_principle). Этот дефект должен быть исправлен, а не работать, или, в противном случае, его экземпляры не должны использоваться, когда 'List' или' ArrayList 'i Ожидается. – ruakh