Java 高效检查一个数组中是否包含某个值

如何检查一个数组(未排序)中是否包含某个特定的值?在Java中,这是一个非常有用并又很常用的操作。同时,在StackOverflow中,有时一个得票非常高的问题。在得票比较高的几个回答中,时间复杂度差别也很大。

1、不同的实现方式

使用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 }

使用循环

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

使用Arrays.binarySearch

  此法为二分搜索法,故查询前需要用sort()方法将数组排序,如果数组没有排序,则结果是不确定的,另外

  如果数组中含有多个指定值的元素,则无法保证找到的是哪一个。

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     }
8 }

2、时间复杂度

使用如下代码来粗略比较不同实现间的时间复杂度。虽然不是很精确,但是思路确实正确的。我们将看看数组在有5、1k、10k个元素的情况下的不同表现。

5个

 1 public static void main(String[] args) {
 2     String[] arr = new String[]{"CD", "BC", "EF", "DE", "AB"};
 3
 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
13     // use set
14     startTime = System.nanoTime();
15     for (int i = 0; i < 100000; i++) {
16         useSet(arr, "A");
17     }
18     endTime = System.nanoTime();
19     duration = endTime - startTime;
20     System.out.println("useSet:  " + duration / 1000000);
21
22     // use loop
23     startTime = System.nanoTime();
24     for (int i = 0; i < 100000; i++) {
25         useLoop(arr, "A");
26     }
27     endTime = System.nanoTime();
28     duration = endTime - startTime;
29     System.out.println("useLoop:  " + duration / 1000000);
30
31     // use Arrays . binarySearch ()
32     startTime = System.nanoTime();
33     for (int i = 0; i < 100000; i++) {
34         useArraysBinarySearch(arr, "A");
35     }
36     endTime = System.nanoTime();
37     duration = endTime - startTime;
38     System.out.println("useArrayBinary:  " + duration / 1000000);
39 }

结果

useList:  12
useSet:  65
useLoop:  2
useArrayBinary:  7

1k个元素

1 int length = 1000;
2 String[] arr = new String[length];
3
4 Random s = new Random();
5 for (int i = 0; i < length; i++) {
6     arr[i] = String.valueOf(s.nextInt());
7 }

结果

useList:  115
useSet:  2010
useLoop:  97
useArrayBinary:  9

10k个元素

1 int length = 10000;
2 String[] arr = new String[length];
3
4 Random s = new Random();
5 for (int i = 0; i < length; i++) {
6     arr[i] = String.valueOf(s.nextInt());
7 }

结果

useList:  1678
useSet:  25609
useLoop:  1802
useArrayBinary:  10

从上面的结果可以清晰看到,使用简单循环的相比使用其他集合操作更高效。很多很多开发人员使用第一种方法,但是它并不是最高效的。将数组转化成其他的任何集合类型都需要先将所有元素读取到集合类中,才能对这个集合类型做其他的事情。

当使用Arrays.binarySearch()方法时,数组必须是排好序的。如果数组不是排好序的,则不能使用这个方法。

事实上,如果你真的需要高效地检查一个数组或者集合中是否包含一个值,一个排好序的数组或者树可以达到O(log(n))的时间复杂度,HashSet甚至能达到O(1)的时间复杂度

转自http://www.diguage.com/archives/112.html

时间: 2024-10-13 03:04:50

Java 高效检查一个数组中是否包含某个值的相关文章

如何高效的查询数组中是否包含某个值

一.有四种方式查询数组中是否包含某个值 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&

一个数组中是否包含某个值

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 HashSe

C# 一个数组中是否包含某个值 总结

总结N种方法,待补充完善 一. Array.IndexOf int id = Array.IndexOf(string[],"要查找的值"); if(id!=-1) 或写成 if(Array.IndexOf(string[],"要查找的值") >= 0) 二.IList ((IList)string[]).Contains"要查找的值") 三.Array.Exists if (Array.Exists(SetSelectIds, eleme

灵魂拷问:如何检查Java数组中是否包含某个值 ?

摘自:https://www.cnblogs.com/qing-gee/p/12053156.html 在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:如何检查Java数组中是否包含某个值 ?像这类灵魂拷问的主题,非常值得深入地研究一下. 另外,我想要告诉大家的是,作为程序员,我们千万不要轻视这些基础的知识点.因为基础的知识点是各种上层技术共同的基础,只有彻底地掌握了这些基础知识点,才能更好地理解程序的运行原理,做出更优化的产品. 我曾在某个技术论坛上分享过

node js 判断数组中是否包含某个值

判断数组中是否包含某个值这里有四种方法.用的测试数据: let arr=["a","b","c"]; let arr2={"a":"aaa","b":"bbb","c":"ccc"}; in判断是否在数组的key里in操作符针对的是key,而非value.而对于普通的一维数组来说,key是隐藏的.所以,对于判断某个数组中是否含有

七、如何在Java中高效检查一个数组是否含有一个值

如何检查一个数组(非排序的)是否包含特定的值.这是个非常有用或经常被在Java中使用.这是个在Stack Overflow中高得票的问题.在已经高得票的答案中,有许多不同的处理方法,但是时间的复杂度非常不同.在下面,我将会展示每种方法的时间花费. 一.四种不同的方法去检查一个数组包含特定的值 1) 用List public static boolean useList(String[] arr, String targetValue) { return Arrays.asList(arr).co

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

 如何检查一个未排序的数组中是否包含某个特定值,这是一个在Java中非常实用并且频繁使用的操作.另外,这也是Stack Overflow上面非常受关注的问题.在得票数最多的答案中,可以看到,检查数组中是否包含特定值可以用多种不同的方式实现,但是时间复杂度差别很大.下面,我将为大家展示各种方法及其需要花费的时间. 1.检查数组中是否包含特定值的四种不同方法 1)使用List: 1 2 3 public static boolean useList(String[] arr, String ta

用JAVA写查询一个字符串中是否包含另外一个字符串以及出现的次数

package JAVA; import java.awt.List;import java.util.ArrayList;/** *  * @author 梁小鱼 * */public class MyTest { public static void main(String[] args) {  //查找字符串在目标字符串是否存在  Boolean isExit = IsExit("f","abfsdfsdkjl;fas;dlfsldf;asdfsdfaszdf"

JS判断一个数组中是否有重复值的三种方法

方法一: var s = ary.join(",")+","; for(var i=0;i<ary.length;i++) { if(s.replace(ary[i]+",","").indexOf(ary[i]+",")>-1) { alert("数组中有重复元素:" + ary[i]); break; } } 方法二: var ary = new Array("