如何高效检查一个数组中是否包含某个值?
转载地址:http://www.diguage.com/archives/112.html
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<String> set = new HashSet<String>(Arrays.asList(arr));return set.contains(targetValue);
}
3) 使用循环:
public static boolean useLoop(String[] arr, String targetValue) {for (String s : arr) {if (s.equals(targetValue)) {return true;}}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"};// use listlong 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);// use setstartTime = System.nanoTime();for (int i = 0; i < 100000; i++) {useSet(arr, "A");}endTime = System.nanoTime();duration = endTime - startTime;System.out.println("useSet: " + duration / 1000000);// use loopstartTime = System.nanoTime();for (int i = 0; i < 100000; i++) {useLoop(arr, "A");}endTime = System.nanoTime();duration = endTime - startTime;System.out.println("useLoop: " + duration / 1000000);// use Arrays . binarySearch ()startTime = System.nanoTime();for (int i = 0; i < 100000; i++) {useArraysBinarySearch(arr, "A");}endTime = System.nanoTime();duration = endTime - startTime;System.out.println("useArrayBinary: " + duration / 1000000);
}
结果:
useList: 12
useSet: 65
useLoop: 2
useArrayBinary: 7
使用大一点的数组(1k个元素):
int length = 1000;
String[] arr = new String[length];Random s = new Random();
for (int i = 0; i < length; i++) {arr[i] = String.valueOf(s.nextInt());
}
结果:
useList: 115
useSet: 2010
useLoop: 97
useArrayBinary: 9
使用更大一点的元素(10k个元素):
int length = 10000;
String[] arr = new String[length];Random s = new Random();
for (int i = 0; i < length; i++) {arr[i] = String.valueOf(s.nextInt());
}
结果:
useList: 1678
useSet: 25609
useLoop: 1802
useArrayBinary: 10
从上面的结果可以清晰看到,使用简单循环的相比使用其他集合操作更高效。很多很多开发人员使用第一种方法,但是它并不是最高效的。将数组转化成其他的任何集合类型都需要先将所有元素读取到集合类中,才能对这个集合类型做其他的事情。
当使用Arrays.binarySearch()
方法时,数组必须是排好序的。如果数组不是排好序的,则不能使用这个方法。
事实上,如果你真的需要高效地检查一个数组或者集合中是否包含一个值,一个排好序的数组或者树可以达到O(log(n))
的时间复杂度,HashSet
甚至能达到O(1)
的时间复杂度。
转载于:https://www.cnblogs.com/archermeng/p/7537229.html
如何高效检查一个数组中是否包含某个值?相关推荐
- java中怎么表示数组中的某个值_简易Java(12):如何高效检查一个数组中是否包含某个值?...
如何检查一个数组(未排序)中是否包含某个特定的值?在Java中,这是一个非常有用并又很常用的操作.同时,在StackOverflow中,有时一个得票非常高的问题.在得票比较高的几个回答中,时间复杂度差 ...
- 灵魂拷问:如何检查 Java 数组中是否包含某个值 ?
作者 | 沉默王二 责编 | Elle 在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:如何检查Java数组中是否包含某个值 ?像这类灵魂拷问的主题,非常值得深 ...
- 灵魂拷问:如何检查Java数组中是否包含某个值 ?
在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:如何检查Java数组中是否包含某个值 ?像这类灵魂拷问的主题,非常值得深入地研究一下. 另外,我想要告诉大家的是, ...
- java 数组包含_灵魂拷问:如何检查 Java 数组中是否包含某个值?
作者 | 沉默王二 责编 | Elle 在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:如何检查Java数组中是否包含某个值 ?像这类灵魂拷问的主题,非常值得深入 ...
- 在Java中如何高效的判断数组中是否包含某个元素
如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种 ...
- JS 判断数组中是否包含某个值
方式一:array.indexOf(searchvalue, start) 判断数组中是否存在某个值,如果存在,则返回数组元素的下标,否则返回-1 参数 描述 searchvalue 必填.规定需检索 ...
- 5种方式,判断一个数组中是否包含某个元素
点击关注公众号,实用技术文章及时了解 来源:xiaoer.blog.csdn.net/article/details/88125957 方法一.使用List public static boolean ...
- JS判断一个数组中是否有重复值的三种方法
方法一: var s = ary.join(",")+","; for(var i=0;i<ary.length;i++) { if(s.replace( ...
- java 数组 包含_Java中高效的判断数组中某个元素是否存在详解
一.检查数组是否包含某个值的方法 使用List public static boolean useList(String[] arr, String targetValue) { return Arr ...
最新文章
- 使用css制作三角,兼容IE6,用到的标签divsspan
- 性能php 教程,提高PHP性能效率的几个技巧
- springboot集成jsp
- LeetCode第五天
- spark官方文档_Spark整合Ray思路漫谈
- LearnOpenGL学习笔记(四)——着色器类编写
- 搜索一个问题 C、C++判断操作系统 是 Linux还是windows 还是Unix【编译器内置宏 探索(不是特别满意)】...
- 【英语阅读】纽约时报 | 抖音式“无意义”短视频能征服全球吗?
- 指纹机和计算机无法连接,考勤机怎么连接到电脑?考勤机连接电脑之后操作指南!...
- win10无法打印网页:打印机遇到异常配置问题0x8007007e 的解决方法
- 记录方维p2p项目后台登录自动化测试验证码问题
- 引用 孙悟空的师傅菩提祖师的真实真份和镇元大仙辈份排名+四大灵猴
- VSCode选择远程服务器的虚拟环境
- 嵌入式行业技术思维导图
- 再说《提督的决断4》
- Pytorch简单一览表
- win7 win8.1搜索不到隐藏中文wifi 已添加隐藏wifi但是没显示
- 自己搭建FRP服务器,速度不错!
- 软件测试——逻辑覆盖
- Perl 邮件地址检查