如何有效地检查数组是否包含 Java 中的值?

7,398次阅读
没有评论

共计 1981 个字符,预计需要花费 5 分钟才能阅读完成。

如何检查数组(未排序)是否包含某个值?这是 Java 中非常有用且经常使用的操作。这也是 Stack Overflow 上投票最多的问题。如投票最多的答案所示,这可以通过几种不同的方式完成,但时间复杂度可能大不相同。下面我将展示每种方法的时间成本。

1. 检查数组是否包含值的四种不同方法

1) 使用​List​:

public static boolean useList(String[] arr, String targetValue) {return Arrays.asList(arr).contains(targetValue);
}

2) 使用 Set:

public static boolean useSet(String[] arr, String targetValue) {Set set = new HashSet(Arrays.asList(arr));
	return set.contains(targetValue);
}

3)使用一个简单的循环:

public static boolean useArraysBinarySearch(String[] arr, String targetValue) {int a =  Arrays.binarySearch(arr, targetValue);
	if(a> 0)
		return true;
	else
		return false;
}

4) 使用​ Arrays.binarySearch()​:

public static boolean useArraysBinarySearch(String[] arr, String targetValue) {int a =  Arrays.binarySearch(arr, targetValue);
	if(a> 0)
		return true;
	else
		return false;
}

2. 时间复杂度

可以使用以下代码来测量大致的时间成本。基本思想是搜索大小为 5、1k、10k 的数组。该方法可能不精确,但其思想清晰而简单。

public static void main(String[] args) {String[] arr = new String[] {  "CD",  "BC", "EF", "DE", "AB"};
 
	
	long startTime = System.nanoTime();
	for (int i = 0; i 100000; i++) {useList(arr, "A");
	}
	long endTime = System.nanoTime();
	long duration = endTime - startTime;
	System.out.println("useList:" + duration / 1000000);
 
	
	startTime = System.nanoTime();
	for (int i = 0; i 100000; i++) {useSet(arr, "A");
	}
	endTime = System.nanoTime();
	duration = endTime - startTime;
	System.out.println("useSet:" + duration / 1000000);
 
	
	startTime = System.nanoTime();
	for (int i = 0; i 100000; i++) {useLoop(arr, "A");
	}
	endTime = System.nanoTime();
	duration = endTime - startTime;
	System.out.println("useLoop:" + duration / 1000000);

结果:

useList:  13
useSet:  72
useLoop:  5

使用更大的数组 (1k):

String[] arr = new String[1000];
 
Random s = new Random();
for(int i=0; i1000; i++){arr[i] = String.valueOf(s.nextInt());
}

结果:

useList:  112
useSet:  2055
useLoop:  99
useArrayBinary:  12

使用更大的数组(10k):

String[] arr = new String[10000];
 
Random s = new Random();
for(int i=0; i

结果:

useList:  1590
useSet:  23819
useLoop:  1526
useArrayBinary:  12

显然,使用简单的循环方法比使用任何集合更有效。很多开发人员使用第一种方法,但效率低下。将数组推送到另一个集合需要在对集合类型执行任何操作之前遍历所有元素以读取它们。

如果使用 Arrays.binarySearch() 方法,则必须对数组进行排序。在这种情况下,数组未排序,因此不应使用它。

实际上,如果您需要有效地检查某个值是否包含在某个数组 / 集合中,排序列表或树可以在 O(log(n)) 中完成,或者 hashset 可以在 O(1) 中完成。

原文地址: 如何有效地检查数组是否包含 Java 中的值?

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-23发表,共计1981字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)