我的问题很清楚。
我有一个列表,我想确保它至少有一个非空元素。这也是,没有循环(性能测量)。
list.size()
在这里绝对没有帮助。因为如果列表包含 5 个空值,那么它的大小也将是 5。
请注意,我不是要一个不能包含null
.
我的问题很清楚。
我有一个列表,我想确保它至少有一个非空元素。这也是,没有循环(性能测量)。
list.size()
在这里绝对没有帮助。因为如果列表包含 5 个空值,那么它的大小也将是 5。
请注意,我不是要一个不能包含null
.
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
。
您可以创建自己的列表实现,将非空元素的数量保留在局部变量中,并在每次添加和删除元素时更新它。
如果您收到一个您只知道它是一个列表的对象(即它实现了List
),那么您没有其他直接或间接循环的解决方案。
该List
接口不提供这样的功能,我知道没有提供它的常用实现。
除了循环或调用循环的方法之外,您别无选择。
编辑:当然,如果你自己编写列表类,你可以做你想做的事情,比如有一个计数器。
我不确定复制构造函数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");
}
Collections.frequency(list, null) > 0
这是一个错误的问题。如果不查看元素,您无法判断列表是否包含null
元素。我可以使用递归给出答案,但这会降低性能并且只是使用任何循环语句来规避。
您想要的是一个首先不允许 null 的集合,或者创建一个实现列表接口并跟踪 null 值是否包含在私有字段中的类。