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



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

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

1)使用List:


1

2

3

public

static

boolean

useList(String[] arr, String targetValue) {

    return

Arrays.asList(arr).contains(targetValue);

}

2)使用Set:


1

2

3

4

public

static

boolean

useSet(String[] arr, String targetValue) {

    Set<String>
set =
new

HashSet<String>(Arrays.asList(arr));

    return

set.contains(targetValue);

}

3)使用一个简单循环:


1

2

3

4

5

6

7

public

static

boolean

useLoop(String[] arr, String targetValue) {

    for(String
s: arr){

        if(s.equals(targetValue))

            return

true
;

    }

    return

false
;

}

4)使用Arrays.binarySearch():

注:下面的代码是错误的,这样写出来仅仅为了理解方便。binarySearch()只能用于已排好序的数组中。所以,你会发现下面结果很奇怪。


1

2

3

4

5

6

7

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的数组是不够精确的,但是思路是清晰的。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

public

static

void

main(String[] args) {

    String[]
arr =
new

String[] { 
"CD"
"BC",
"EF",
"DE",
"AB"};

 

    //use
list

    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);

 

    //use
set

    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);

 

    //use
loop

    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);

 

    //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);

}

结果:


1

2

3

4

useList: 
13

useSet: 
72

useLoop: 
5

useArraysBinarySearch: 
9

对于长度为1K的数组:


1

2

3

4

5

6

String[]
arr =
new

String[
1000];

 

Random
s =
new

Random();

for(int

i=
0;
i<
1000;
i++){

    arr[i]
= String.valueOf(s.nextInt());

}

结果:


1

2

3

4

useList: 
112

useSet: 
2055

useLoop: 
99

useArrayBinary: 
12

对于长度为10K的数组:


1

2

3

4

5

6

String[]
arr =
new

String[
10000];

 

Random
s =
new

Random();

for(int

i=
0;
i<
10000;
i++){

    arr[i]
= String.valueOf(s.nextInt());

}

结果:


1

2

3

4

useList: 
1590

useSet: 
23819

useLoop: 
1526

useArrayBinary: 
12

很明显,使用简单循环的方法比使用其他任何集合效率更高。许多开发者会使用第一种方法,但是它并不是高效的。将数组压入Collection类型中,需要首先将数组元素遍历一遍,然后再使用集合类做其他操作。

如果使用Arrays.binarySearch()方法,数组必须是已排序的。由于上面的数组并没有进行排序,所以该方法不可使用。

实际上,如果你需要借助数组或者集合类高效地检查数组中是否包含特定值,一个已排序的列表或树可以做到时间复杂度为O(log(n)),hashset可以达到O(1)。

原文链接: programcreek 翻译: ImportNew.com0x0bject

时间: 2024-10-27 04:54:10

如何高效地判断数组中是否包含某特定值的相关文章

【Simple Java】怎样高效判断数组中是否包含某个特定值

怎样判断一个无序数组是否包含某个特定值?这在JAVA中是一个非常实用的操作,在Stack Overflow问答网站中也同样是一个热门问题: 要完成这个判断,可以通过若干种不同的方式实现,每种实现方式对应的时间复杂读会有很大的不同: 接下来我将展示不同实现方式的时间开销. 四种不同方式检查数组是否包含某个值 使用List: public static boolean useList(String[] arr, String targetValue) { return Arrays.asList(a

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

如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种不同的方法,但是他们的时间复杂度也是各不相同的.本文将分析几种常见用法及其时间成本. 检查数组是否包含某个值的方法 使用List public static boolean useList(String[] arr, String targetValue) { return Arrays.asLis

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

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

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

如何检查一个数组(未排序)中是否包含某个特定的值?在Java中,这是一个非常有用并又很常用的操作.同时,在StackOverflow中,有时一个得票非常高的问题.在得票比较高的几个回答中,时间复杂度差别也很大. 1.不同的实现方式 使用list 1 public static boolean useList(String[] arr, String targetValue) { 2 return Arrays.asList(arr).contains(targetValue); 3 } 使用se

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

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

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

四种不同方式检查数组是否包含某个值 使用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<S

js中判断数组中是否包含某元素的方法

方法一:array.indexOf(item,start):元素在数组中的位置,如果没与搜索到则返回 -1. 参数 描述 item 必须.查找的元素. start 可选的整数参数.规定在数组中开始检索的位置.它的合法取值是 0 到 stringObject.length - 1. 如省略该参数,则将从字符串的首字符开始检索. 实际用法:if(arr.indexOf(某元素) > -1){//则包含该元素} var fruits = ["Banana", "Orange&

JQuery判断数组中是否包含某个元素$.inArray(&quot;js&quot;, arr);

var arr = [ "xml", "html", "css", "js" ]; $.inArray("js", arr);  //返回 3, 如果不包含在数组中,则返回 -1;

JQuery判断数组中是否包含某个元素$.inArray(&quot;元素字符串&quot;, 数组名称);

var arry = [ "C#", "html", "css", "JavaScript" ]; var result= $.inArray("C#", arry); //如果arry数组里面存在"C#" 这个字符串则返回该字符串的数组下标,否则返回(不包含在数组中) -1