【问题标题】:Remove null elements from list从列表中删除空元素
【发布时间】:2012-01-23 11:03:39
【问题描述】:
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 元素?

【问题讨论】:

标签: java


【解决方案1】:

这应该可行:

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

【讨论】:

  • List.removeAll() 的时间复杂度为 n^2。只是说。
  • @Hermanth 对于那个单身人士来说,n*mm==1 的复杂性难道不是一样吗?
【解决方案2】:

在 java 8 中你可以使用Collection.removeIf:

list.removeIf(Objects::isNull);

【讨论】:

    【解决方案3】:

    扩展ArrayList 并覆盖add() & addAll() 方法,根本不允许null

    或者你可以使用list.removeAll(null);,如图here 内部迭代循环

    【讨论】:

    • 我不喜欢扩展这样的类,因为它可能导致代码混乱。您还应该记住,您还可以使用 ListIterator 将项目添加到列表中
    【解决方案4】:

    看看 LambdaJ,它允许您“无”循环操作集合。实际上循环是在库中实现的,但它真的很酷,它简化了您的代码并使其更短。

    【讨论】:

      【解决方案5】:

      效率不高,但有效

      while(list.remove(null));

      【讨论】:

        【解决方案6】:

        当前的答案没有区分可变和不可变列表,我发现很多方法都丢失了。从 开始引入List.of(..),这一点变得更加重要,尽管有一个cannotnull 元素传递给它。无论如何,删除都是相关的(例如,删除某个非空元素)。

        不可变列表

        不可变列表的一个例子是Arrays.asList(..)(但元素仍然可以替换,但不能添加/删除)或已经提到的List.of(..)。只要不能使用List 方法添加/删除元素,它们就被视为“不可变包装器”。

        List<String> immutableList = Arrays.asList("one", null, "two");
        
        • 使用 Stream#filter(Predicate) 方法:

          List<String> newList = immutableList.stream()
              .filter(Objects::nonNull)
              .collect(Collectors.toList());
          
        • 带有索引或增强型的 For-each 循环适用于(不仅)Java 版本 及更低版本。

          // note we need to create a mutable List to add the non-null elements
          List<String> newList = new ArrayList<>();
          for (String str: immutableList) {
              if (str != null) {
                   newList.add(str);
              }
          }
          

        可变列表

        可变列表的一个示例是List 接口的新实例,例如new ArrayList&lt;&gt;()new LinkedList&lt;&gt;()。它们是可变的,因此使用 List#addList#addAll 添加元素是可能的,并且是一种常用的方法。

        List<String> mutableList = new ArrayList<>(Arrays.asList("one", null, "two"));
        

        这里列出了从此类List 中删除所有null 元素的方法。注意它修改列表。

        • List#removeIf(Predicate)

          mutableList.removeIf(Objects::isNull);
          
        • Iterator 是从List 中删除元素的推荐方法,并且适用于(不仅)Java 版本 及更低版本

          Iterator<String> iterator = mutableList.iterator();
          while (iterator.hasNext()) {
              if (iterator.next() == null) {
                  iterator.remove();
              }
          }
          
        • 不可变列表部分中提到的所有方法总是会产生一个新的List

        【讨论】:

          【解决方案7】:

          如果您自己构建列表并且不确定该值是否为空,您也可以使用CollectionUtils.addIgnoreNull(list,elementToAdd); 这将防止添加空元素。这仅在构建列表时有效。如果您从其他地方接收列表并希望在使用列表之前删除所有非空元素,那么list.removeAll(Collections.singleton(null)); 将是最好的

          【讨论】:

            【解决方案8】:
            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--){
            

            这是一个升序,这个问题的降序是什么?

            【讨论】:

            • 问题应该在单独的线程上提出。 Click here 如果你想问你的问题。回答一个问题意味着回答一个问题,而不是问另一个问题。
            【解决方案9】:

            使用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);
                    }
                }));
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-10-28
              • 1970-01-01
              • 2019-04-06
              • 2016-05-28
              • 1970-01-01
              • 1970-01-01
              • 2017-03-05
              相关资源
              最近更新 更多