怎样高效地去判断array中是否包含某个值?

author author     2022-08-11     554

关键词:

问题

怎样去判断Array(无序)中是否包含某个值呢?

这是一个在Java中经常被问到的问题。它也是Stack Overflow上投票前几的一个问题。下面将展示投票前几的几个回答,这些回答使用不同的方式解决了这个问题,但是,时间复杂度也是各有不同的。

四种解决方法

使用List

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

使用Set

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

使用Loop

  1. public static boolean useLoop(String[] arr, String targetValue) {
  2. for (String s : arr) {
  3. if (s.equals(targetValue))
  4. return true;
  5. }
  6. return false;
  7. }

使用ArraysBinarySearch,这个方法只适用于已排序的Array

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

时间复杂度

这大概的运行时间可以通过下面的代码进行衡量。这基本的思路是通过在大小分别为5,1k,10k的Array中进行查找。这个方法可能不够精确,但是这个思路还是很简单清晰的。

注:测试环境为win7-64+JDK1.6

使用Array大小为5

  1. public static void main(String[] args) {
  2. System.out.println("---------array size is 5-----------");
  3. String[] arr = new String[] { "CD", "BC", "EF", "DE", "AB" };
  4. //use list
  5. long startTime = System.nanoTime();
  6. for (int i = 0; i < 100000; i++) {
  7. useList(arr, "A");
  8. }
  9. long endTime = System.nanoTime();
  10. long duration = endTime - startTime;
  11. System.out.println("useList: " + duration / 1000000+" 毫秒");
  12. //use set
  13. startTime = System.nanoTime();
  14. for (int i = 0; i < 100000; i++) {
  15. useSet(arr, "A");
  16. }
  17. endTime = System.nanoTime();
  18. duration = endTime - startTime;
  19. System.out.println("useSet: " + duration / 1000000+" 毫秒");
  20. //use loop
  21. startTime = System.nanoTime();
  22. for (int i = 0; i < 100000; i++) {
  23. useLoop(arr, "A");
  24. }
  25. endTime = System.nanoTime();
  26. duration = endTime - startTime;
  27. System.out.println("useLoop: " + duration / 1000000+" 毫秒");
  28. //use Arrays.binarySearch()
  29. startTime = System.nanoTime();
  30. for (int i = 0; i < 100000; i++) {
  31. useArraysBinarySearch(arr, "A");
  32. }
  33. endTime = System.nanoTime();
  34. duration = endTime - startTime;
  35. System.out.println("useArrayBinary: " + duration / 1000000+" 毫秒");
  36. }

结果:

  1. ---------array size is 5-----------
  2. useList: 10 毫秒
  3. useSet: 66 毫秒
  4. useLoop: 4 毫秒
  5. useArrayBinary: 4 毫秒

### 使用Array大小为1k

  1. System.out.println("---------array size is 1k----------");
  2. String[] arr = new String[1000];
  3. Random s = new Random();
  4. for (int i = 0; i < 1000; i++) {
  5. arr[i] = String.valueOf(s.nextInt());
  6. }

结果:

  1. ---------array size is 1k----------
  2. useList: 762 毫秒
  3. useSet: 7549 毫秒
  4. useLoop: 677 毫秒
  5. useArrayBinary: 14 毫秒

使用Array大小为10k

  1. System.out.println("---------array size is 10k---------");
  2. String[] arr = new String[10000];
  3. Random s = new Random();
  4. for (int i = 0; i < 10000; i++) {
  5. arr[i] = String.valueOf(s.nextInt());
  6. }

结果:

  1. ---------array size is 10k---------
  2. useList: 7395 毫秒
  3. useSet: 126341 毫秒
  4. useLoop: 5776 毫秒
  5. useArrayBinary: 17 毫秒

总结

从测试的结果可以清楚地知道,使用简单的Loop比使用集合操作更加有效 。许多开发者使用List方式,但是那并不高效。把Array放到另一个Collection中需要读取Array中的所有元素,这将花费不少的时间。

使用Arrays.binarySearch()的前提是这Array必须是有序的。

实际上,如果你真正需要高效地去判断Array/Collection中是否包含某个值,一个排序了的List或者Tree的时间复杂度为O(log(n)),或者用HashSet,它的时间复杂度为O(1)。

原文链接:http://www.programcreek.com/2014/04/check-if-array-contains-a-value-java/
翻译:crane-yuan
[ 转载请保留原文出处、译者和译文链接。]



来自为知笔记(Wiz)


java中如何高效判断数组中是否包含某个特定的值

四种不同方式检查数组是否包含某个值 使用List:publicstaticbooleanuseList(String[]arr,StringtargetValue){returnArrays.asList(arr).contains(targetValue);}  使用Set:publicstaticbooleanuseSet(String[]arr,Stringta 查看详情

如何高效地判断数组中是否包含某特定值

如何检查一个未排序的数组中是否包含某个特定的值,这是在Java中非常实用并且频繁使用的操作。另外,检查数组中是否包含特定值可以用多种不同的方式实现,但是时间复杂度差别很大。下面,我将为大家展示各种方法及其... 查看详情

如何高效地判断数组中是否包含某特定值

        如何检查一个未排序的数组中是否包含某个特定值,这是一个在Java中非常实用并且频繁使用的操作。检查数组中是否包含特定值可以用多种不同的方式实现,但是时间复杂度差别很大。下面... 查看详情

在java中如何高效判断数组中是否包含某个元素

  如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作。同时,这个问题在StackOverflow中也是一个非常热门的问题。在投票比较高的几个答案中给出了几种不同的方法,但是他们的时... 查看详情

在java中如何高效判断数组中是否包含某个元素

如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作。同时,这个问题在StackOverflow中也是一个非常热门的问题。在投票比较高的几个答案中给出了几种不同的方法,但是他们的时间... 查看详情

前端面试javascript—js判断数组中是否包含某个值(代码片段)

方法一:array.indexOf()此方法判断数组中是否存在某个值,如果存在,则返回数组元素的下标,否则返回-1vararr=[1,2,3,4];varindex=arr.indexOf(3);console.log(index);//2方法二:array.includes()此方法判断数组中是否存在某... 查看详情

前端面试javascript—js判断数组中是否包含某个值(代码片段)

方法一:array.indexOf()此方法判断数组中是否存在某个值,如果存在,则返回数组元素的下标,否则返回-1vararr=[1,2,3,4];varindex=arr.indexOf(3);console.log(index);//2方法二:array.includes()此方法判断数组中是否存在某... 查看详情

在java中如何高效的判断数组中是否包含某个元素(代码片段)

importorg.apache.commons.lang3.ArrayUtils;publicstaticbooleanuseArrayUtils(String[]arr,StringtargetValue)returnArrayUtils.contains(arr,targetValue);  查看详情

php判断二维数组中是否含有某个值(代码片段)

$arr=array(array(‘a‘,‘b‘),array(‘c‘,‘d‘));in_array(‘a‘,$arr);//此时返回的永远都是falsedeep_in_array(‘a‘,$arr);//此时返回true值functiondeep_in_array($value,$array)foreach($arrayas$item)if(!is_array($item))if($ite 查看详情

检查数组是否包含某个值的方法

检查数组是否包含某个值的方法使用ListpublicstaticbooleanreturnArrays.asList(arr).contains(targetValue);}使用SetpublicstaticsetnewHashSet<String>(Arrays.asList(arr));returnset.contains(targetValue);}使用循环判断publicsta 查看详情

判断json是否包含了每个键php

(1)可以用array_key_exists去判断object对象或array数组中是否含有某个键;(2)不可以用isset去判断判断object对象或array数组中是否含有某个键  $decodedJsonObj=json_decode($respJson);  var_dump(array_key_exists("access_token",$decodedJsonObj 查看详情

5种方式,判断一个数组中是否包含某个元素

点击关注公众号,实用技术文章及时了解来源:xiaoer.blog.csdn.net/article/details/88125957方法一、使用Listpublic static boolean useList(String[] arr, String targetValue)     return Arrays.asList(arr).contains(target 查看详情

jquery如何判断值中是不是包含某个值?

比如$("#txt_Price").val()获取了它的值,如何判断值中是否有标点?参考技术AJQuery判断值中是否包含某个值的方法是利用contains函数:1、定义一个源字符串:vartestStr="Thisisatest";2、利用contains方法测试是否含有test字样:... 查看详情

scala判断array中是不是有某个元素

...String>(Arrays.asList(arr));returnset.contains(targetValue);使用循环判断1234567publicstaticbooleanuseLoop(String[]arr,StringtargetValue)for(Strings:arr)if(s.equals(targetValue))returntrue;returnfalse;使用Arrays.binarySearch()Arrays.binarySearch()方法只能用于有序数组!!!如... 查看详情

php判断数组里是不是有某个值

可以直接使用php内置函数in_array()来实现判断。phpin_array函数用于检查数组中是否存在某个值,如果存在,则返回true,否则返回false。大致的编程思路:1、所用到的函数:phpin_array()检查数组中是否存在某个值;in_array检查数组中是... 查看详情

c#判断数组中是否存在某个值(代码片段)

方法11int[]ia=1,2,3;2intid=Array.IndexOf(ia,1);//这里的1就是你要查找的值 方法21string[]strArr="a","b","c","d","e";2boolexists=((IList)strArr).Contains("a");参考网址  [1]https://www.cnblogs.com/superelement/p/76 查看详情

js怎么判断某个数组里面是不是包含这个元素

...为数组中的最靠前元素在数组的位置参考技术A在C#语法中判断集合是否包含某个元素可以使用Contains方法,但是类似的问题在javascript中要怎么处理呢,js中没有Contains方法。我们可以利用js的原型扩展来封装一个我们自己的Contains... 查看详情

python:如何判断列表中的元素是否包含某个数字?(代码片段)

例如,如果我输入:li=[33];3inli我明白了:False如果我检查33是否存在,当然我得到“真实”。如何正确检查列表元素中是否存在数字?答案一个非常简单的方法是这个:li=[33,44,55]['3'instr(x)forxinli]这给了[True,False,False]通过使用列表... 查看详情