怎样高效地去判断Array中是否包含某个值?
问题
怎样去判断Array(无序)中是否包含某个值呢?
这是一个在Java中经常被问到的问题。它也是Stack Overflow上投票前几的一个问题。下面将展示投票前几的几个回答,这些回答使用不同的方式解决了这个问题,但是,时间复杂度也是各有不同的。
四种解决方法
使用List
public static boolean useList(String[] arr, String targetValue) {return Arrays.asList(arr).contains(targetValue);}
使用Set
public static boolean useSet(String[] arr, String targetValue) {Set<String> set = new HashSet<String>(Arrays.asList(arr));return set.contains(targetValue);}
使用Loop
public static boolean useLoop(String[] arr, String targetValue) {for (String s : arr) {if (s.equals(targetValue))return true;}return false;}
使用ArraysBinarySearch,这个方法只适用于已排序的Array
public static boolean useArraysBinarySearch(String[] arr, String targetValue) {int a = Arrays.binarySearch(arr, targetValue);if (a > 0)return true;elsereturn false;}
时间复杂度
这大概的运行时间可以通过下面的代码进行衡量。这基本的思路是通过在大小分别为5,1k,10k的Array中进行查找。这个方法可能不够精确,但是这个思路还是很简单清晰的。
注:测试环境为win7-64+JDK1.6
使用Array大小为5
public static void main(String[] args) {System.out.println("---------array size is 5-----------");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+" 毫秒");}
结果:
---------array size is 5-----------useList: 10 毫秒useSet: 66 毫秒useLoop: 4 毫秒useArrayBinary: 4 毫秒
### 使用Array大小为1k
System.out.println("---------array size is 1k----------");String[] arr = new String[1000];Random s = new Random();for (int i = 0; i < 1000; i++) {arr[i] = String.valueOf(s.nextInt());}
结果:
---------array size is 1k----------useList: 762 毫秒useSet: 7549 毫秒useLoop: 677 毫秒useArrayBinary: 14 毫秒
使用Array大小为10k
System.out.println("---------array size is 10k---------");String[] arr = new String[10000];Random s = new Random();for (int i = 0; i < 10000; i++) {arr[i] = String.valueOf(s.nextInt());}
结果:
---------array size is 10k---------useList: 7395 毫秒useSet: 126341 毫秒useLoop: 5776 毫秒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
[ 转载请保留原文出处、译者和译文链接。]
怎样高效地去判断Array中是否包含某个值?的更多相关文章
- node js 判断数组中是否包含某个值
判断数组中是否包含某个值这里有四种方法.用的测试数据: let arr=["a","b","c"]; let arr2={"a&q ...
- js判断数组中是否包含某个值
/** * 判断数组中是否包含某个值 * @param arr 数组 * @param str 值 * @returns {boolean} */ function contains(arr, str ...
- Js 判断数组中是否包含某个值
includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false. JavaScript Array includes() 方法
- List containsKey 和Map contains 判断集合中是否包含某个值
map集合 //1.第一种 HashMap map = new HashMap(); map.put("1", "value1"); map.put(" ...
- 161101、在Java中如何高效判断数组中是否包含某个元素
如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种 ...
- 在Java中如何高效的判断数组中是否包含某个元素
原文出处: hollischuang(@Hollis_Chuang) 如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Ove ...
- java中如何高效判断数组中是否包含某个特定的值
四种不同方式检查数组是否包含某个值 使用List: public static boolean useList(String[] arr, String targetValue) { return A ...
- 在Java中如何高效判断数组中是否包含某个元素
如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种 ...
- java中如何高效的判断数组中是否包含某个元素---
package zaLearnpackage; import org.apache.commons.lang3.ArrayUtils; import java.util.Arrays; import ...
随机推荐
- React 根据官方总结的规范
1.语法上,根据生命周期方法执行的顺序编写代码 (1 生命周期方法[getDefaultProps, getInitialState, componentWillMount, componentDid ...
- const ,static,inline
const: 1 定义变量 ,如下写法都可以: TYPE const ValueName = value; const TYPE ValueName = value; ...
- 【Android】如何快速构建Android Demo
[Android]如何快速构建Android Demo 简介 在 Android 学习的过程中,经常需要针对某些项目来写一些测试的例子,或者在做一些 demo 的时候,都需要先写 Activity 然 ...
- IOS8Preview-xCode_6
IOS8Preview-xCode_6 what's new What's new in xCode 6 Xcode 6 introduces a radically new way to desig ...
- PostgreSQL和Greenplum、Npgsql
PostgreSQL和Greenplum.Npgsql 想着要不要写,两个原因“懒”和“空”.其实懒和空也是有联系的,不是因为懒的写,而是因为对PostgreSQL和Npgsql的知识了解匮乏,也就懒 ...
- 破解android手机图形锁
安卓手机的图形锁包括3*3,4*4,5*5的点阵,按次序连接数个点从而达到锁定/解锁的功能.以3*3为例,最少需要连接4个点,最多能连接9个点.在我们进行绘制图形的过程中,每选中这9个点中的一个点,实 ...
- 一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL
介绍 不知道大家在使用 ASP.NET MVC 时有没有一些扩展要求,反正我是有很多.在使用 MVC 这几年(PS:我是从 1.0 开始学,2.0.3.0 开发至今),我深深地觉得 MVC 的扩展性真 ...
- 15套帮助你展示 App 设计的透视屏幕原型素材
Dribbble 和 Behance 是最好两个展示你的设计作品的地方.现在流行使用透视屏幕来展示应用程序设计效果,尤其是在 Dribbble 上面,有众多高品质的免费资源和设计素材. 这篇文章汇集了 ...
- 潮流设计:15个创意的 3D 字体版式作品欣赏
3D字体设计是真的很棒,它最适用于广告.使用3D文字和不同的惊人效果,例如灯光或纹理带来了很多东西.在版式设计中,最重要的是消息.如果它抓住了用户的注意力,设计工作是在正确的轨道上. 您可能感兴趣的相 ...
- BABOK2主要概要输入输出图