我有一个布尔值列表,检查其中一个布尔值是否为真且其他布尔值都为假的最有效方法是什么?
例如,我有一个包含100个布尔值的数组,如何检查1布尔值是否为真,所有其他布尔值是否为假。
答案 0 :(得分:2)
作者想知道是否只有1个值是布尔值
在C#中我会做类似的事情如何检查1布尔值是否为真且所有其他布尔值均为假。
假设
List<bool> booleanList;
然后
int trueCount = booleanList.Count(b => b);
int falseCount = booleanList.Count(b => !b);
答案 1 :(得分:1)
遍历列表并检查每个值。如果找到第二个真值,请停止:
boolean found = false;
for (boolean b : list) {
if (b) {
if (found) return false;
found = true;
}
}
return found;
或者,您可以使用List.indexOf
和List.lastIndexOf
:
int indexOfFirstTrue = list.indexOf(true);
return indexOfFirstTrue != -1 && list.lastIndexOf(true) != indexOfFirstTrue;
答案 2 :(得分:1)
最高效的方法是使用BitSet
而不是数组:
BitSet set = new BitSet(100); // ~ boolean[] array = new boolean[100];
set.set(42); // ~ array[42] = true;
[...]
int countTrueBits = set.cardinality();
BitSet
使用移位操作,因此非常快。
答案 3 :(得分:0)
int countTrue=0;
for(boolean value: [Your List]){
if(value)
countTrue++;
if(countTrue>1)
break;
}
Check countTrue==1 OR not
答案 4 :(得分:0)
如果您使用的是Java 8,可以使用:
long size = booleanList.stream().filter(b -> Boolean.TRUE.equals(b)).count();
if(size == 1) {
// do something
}
答案 5 :(得分:0)
使用Java 8流
List<Boolean> bools = list.stream().filter(val -> false)
.collect(Collectors.asList());
if (bools.size()==99) { ...}
您筛选出所有真实的值。如果您的列表有100个值,您将收到一个包含99个错误值的新列表。
如果您知道列表中只有1个真值,则可以在找到它时停止。
list.stream().filter(val -> true)
.findFirst()
.get();
它会获得遇到的第一个true
值并将其返回Optional
答案 6 :(得分:0)
int countTrue=0;
for(boolean value: [Your List]){
if(value){
countTrue++;
if(countTrue>1){
// true is more than one time
break;
}
}
}
答案 7 :(得分:0)
在使用LinQ的C#中,您可以在单行代码中完成
var check = itemList.Any(x => x.isActive == true);
如果列表中有任何一个模型处于活动状态,它将返回true。
答案 8 :(得分:0)
我使用了来自System.Linq的IEnumerable.Count(Func),其中T为bool
bool[] values = {true, false, false, false};
int trueCount = values.Count(b=> b);
这将是列表中