Java 检查布尔值数组是否包含true的最快方法
我有一个Java 检查布尔值数组是否包含true的最快方法,java,Java,我有一个数组的布尔值项: boolean[] myBooleanArray = new boolean[24]; 目前我检查它是否包含true,如下所示: Arrays.asList(myBooleanArray).contains(true); 这是检查布尔值数组的最快方法吗?如果不是,执行此检查的最快方法是什么 编辑: 通过在Android 4.03三星S2设备上运行应用程序,我对您答案中的方法进行了如下计时: boolean[] myBooleanArray = new boolean
数组
的布尔值
项:
boolean[] myBooleanArray = new boolean[24];
目前我检查它是否包含true,如下所示:
Arrays.asList(myBooleanArray).contains(true);
这是检查布尔值数组的最快方法吗?如果不是,执行此检查的最快方法是什么
编辑:
通过在Android 4.03三星S2设备上运行应用程序,我对您答案中的方法进行了如下计时:
boolean[] myBooleanArray = new boolean[24];
long startTime = System.nanoTime();
suggestedMethod(myBooleanArray);
long endTime = System.nanoTime();
long duration = endTime - startTime;
Log.i("timetest", Long.toString(duration));
时间排名超过五分的是,最快的第一名:
for (boolean value : myBooleanArray) {
if (value) {
return true;
}
}
return false;
Arrays.asList(myBooleanArray).contains(true);
Booleans.contains(myBooleanArray, true);
只需遍历数组
for(boolean value: myBooleanArray){
if(value){ return true;}
}
return false;
据介绍,使用增强for或普通for对数组进行迭代基本相同,因为两者都使用数组访问。因此,只需在数组上迭代:
public boolean containsTrue(boolean[] array){
for(boolean val : array){
if(val)
return true;
}
return false;
}
如果您正在使用库(库中有很多有用的东西):
()
该方法的文档还描述了另一种方法。您可以用
位集替换布尔[]
(应该更节省内存)并调用!bitSet.isEmpty()
检查是否至少有一个位为真。一般来说,如果你有一个数组(或列表)
,在其中查找项目的最快/唯一的方法是在数组上迭代,直到找到你要查找的内容。这是数组/List
s的限制之一
对于一个包含24个元素的数组,我无论如何都不会担心这个问题。如果您有数百万项,并且期望的true
s很少(或者可能没有),那么将数据封装在类中是有意义的:
public class BooleanArray
{
boolean[] arr = new boolean[SIZE]; // or get size from a constructor
boolean anyTrue = false;
boolean get(int index) {
return arr[index];
}
boolean set(int index, boolean value) {
arr[index] = value;
anyTrue |= value;
}
boolean containsAnyTrues() {
return anyTrue;
}
}
重申一下,我不建议对包含24个元素的数组执行此操作。我的意思是,这更像是一个示例,您的数据结构应该支持预期的用例。如果预期的用例是“大量元素,非常稀疏的true
s,需要找出是否存在任何true
s”,那么您对最快方式的关注就更为相关,像上面这样的数据结构将非常有用。如果您有一个0和1的数组,您可以简单地或每个元素。如果得到1,则至少有一个TRUE。如果未绑定到布尔数组,则应查看该类。尽管名称不同,但它更像数组而不是集合
如果“数组”中存在任何true
,则该方法将回答您的问题,并实现为:
public boolean isEmpty()
{
return wordsInUse == 0;
}
我怀疑你能得到更快的支票
但代价必须在别处付出:如果您知道数组的大小,并且数组很大,那么设置/取消设置值可能比单纯的布尔[]
更昂贵。24相当小,所以很难改进。Arrays.mismatch似乎要快一点
import java.util.Arrays;
import java.util.Random;
public class BenchMark{
final static int N = Short.MAX_VALUE;
static boolean[] base = new boolean[N];
static boolean any1(boolean[] test){
return Arrays.mismatch(base, test)==-1;
}
static boolean any2(boolean[] test){
for(boolean b: test)
if(b) return true;
return false;
}
public static void main(String[] args){
boolean[] test = new boolean[N];
Random r = new Random(1);
int last = 0;
long start = System.nanoTime();
int p = 0;
for(int i = 0; i<100000; i++){
test[last] = false;
int s = r.nextInt(2);
if(s == 0){
last = r.nextInt(test.length);
test[last] = true;
}
if(any2(test)){
p++;
}
}
System.out.println( ( p + " in " + (System.nanoTime() - start ) / 1e9 ) + " seconds");
}
}
导入java.util.array;
导入java.util.Random;
公共课基准{
最终静态int N=Short.MAX_值;
静态布尔值[]基=新布尔值[N];
静态布尔any1(布尔[]测试){
返回数组。不匹配(基,测试)=-1;
}
静态布尔any2(布尔[]测试){
for(布尔b:测试)
如果(b)返回true;
返回false;
}
公共静态void main(字符串[]args){
布尔[]测试=新布尔[N];
随机r=新随机(1);
int last=0;
长启动=System.nanoTime();
int p=0;
对于(int i=0;iArrays.asList(myBooleanArray)
为您提供的数组列表不是布尔值
s。该方法不应用于原语数组。为什么您不对您的各种选项进行基准测试,看看而不是相信其他选项?@Rohit Jain.公平点,但我没有足够的经验知道所有选项是什么。有了这些答案,我可以做基准测试。@pierrymiortz..Hmm、 是的,对。谢谢大家的建议。请参阅编辑后的答案,了解方法的基准测试。OP只想检查true
的存在性,这并不是所有的true
,这是最快的方法吗?因为它也通过使用contains方法来做同样的事情,因为它也是有问题的。我想不出任何更快的方法用于boolean数组(但位集实际上可能更快)。
import java.util.Arrays;
import java.util.Random;
public class BenchMark{
final static int N = Short.MAX_VALUE;
static boolean[] base = new boolean[N];
static boolean any1(boolean[] test){
return Arrays.mismatch(base, test)==-1;
}
static boolean any2(boolean[] test){
for(boolean b: test)
if(b) return true;
return false;
}
public static void main(String[] args){
boolean[] test = new boolean[N];
Random r = new Random(1);
int last = 0;
long start = System.nanoTime();
int p = 0;
for(int i = 0; i<100000; i++){
test[last] = false;
int s = r.nextInt(2);
if(s == 0){
last = r.nextInt(test.length);
test[last] = true;
}
if(any2(test)){
p++;
}
}
System.out.println( ( p + " in " + (System.nanoTime() - start ) / 1e9 ) + " seconds");
}
}