2

我的问题很清楚。

我有一个列表,我想确保它至少有一个非空元素。这也是,没有循环(性能测量)。

list.size()

在这里绝对没有帮助。因为如果列表包含 5 个空值,那么它的大小也将是 5。

请注意,我不是要一个不能包含null.

4

6 回答 6

8

List没有显式或隐式循环的标准实现无法做到这一点1。API不支持这一点List,并且没有任何标准列表类包含在专门的操作中。

避免循环的唯一方法是创建一个将其视为特殊的自定义List实现,并计算列表中元素null的数量。null这种方法的缺点是列表上的更新操作更昂贵,因为它们需要测试以查看是否需要更改计数器。

请注意,使用手动编码的循环通常不会那么昂贵,因为您可以在看到非空元素后立即停止循环。


1 - 如果您关心效率,那么在某些方法中的隐式循环Collections.frequency可能比为此目的而手动编写的循环要昂贵得多。


跟进

我没有创建或填写列表。我从一些我无法更改的代码中获得了已经生成的列表。

在这种情况下,像下面这样的循环是最快的解决方案:

boolean empty = true;
for (SomeType t : list) {
   if (t != null) {
       empty = false;
       break;
   }
}

如果列表是 a ,索引可能ArrayList会稍微快一点,但不是 a LinkedList

于 2013-09-12T14:38:54.223 回答
6

您可以创建自己的列表实现,将非空元素的数量保留在局部变量中,并在每次添加和删除元素时更新它。

于 2013-09-12T14:32:28.583 回答
3

如果您收到一个您只知道它是一个列表的对象(即它实现了List),那么您没有其他直接或间接循环的解决方案。

List接口不提供这样的功能,我知道没有提供它的常用实现。

除了循环或调用循环的方法之外,您别无选择。

编辑:当然,如果你自己编写列表类,你可以做你想做的事情,比如有一个计数器。

于 2013-09-12T14:29:50.973 回答
0

我不确定复制构造函数ArrayList是否实际上是循环的,但这可以解决问题,String以我的示例为例。removeAll另一方面,确实在内部循环......所以这并不是真正的“不循环”......

  List<String> testLst = new ArrayList<String>();
  testLst.add(null);
  testLst.add(null);
  testLst.add(null);
  testLst.add(null);

  List<String> testLst2 = new ArrayList<String>();
  testLst2.add(null);
  testLst2.add(null);
  testLst2.add(null);
  testLst2.add(null);
  testLst2.add("test");

  List<String> nullLst = new ArrayList<String>();
  nullLst.add(null);
  List<String> removedNull = new ArrayList<String>(testLst);
  removedNull.removeAll(nullLst);

  if (testLst.size() > 0 && removedNull.size() > 0) {
    System.out.println("Contains non-null");
  } else {
    System.out.println("Contains only null or empty");
  }

  removedNull = new ArrayList<String>(testLst2);
  removedNull.removeAll(nullLst);
  if (testLst2.size() > 0 && removedNull.size() > 0) {
    System.out.println("Contains non-null");
  } else {
    System.out.println("Contains only null or empty");
  }
于 2013-09-12T14:52:24.633 回答
0
Collections.frequency(list, null) > 0
于 2013-09-12T14:32:18.440 回答
-1

这是一个错误的问题。如果不查看元素,您无法判断列表是否包含null元素。我可以使用递归给出答案,但这会降低性能并且只是使用任何循环语句来规避。

您想要的是一个首先不允许 null 的集合,或者创建一个实现列表接口并跟踪 null 值是否包含在私有字段中的类。

于 2013-09-12T14:35:42.263 回答