zoukankan      html  css  js  c++  java
  • How to Check if an Array Contains a Value in Java Efficiently?---reference

    How to check if an array (unsorted) contains a certain value? This is a very useful and frequently used operation in Java. It is also a top voted question on Stack Overflow. As shown in top voted answers, checking if an array contains a certain value can be done in several different ways, but the time complexity could be very different. In the following I will show the time each method takes.

    1. 4 Different Ways to Check If an Array Contains a Value

    1) Using List:

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

    2) Using Set:

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

    3) Using a simple loop:

    public static boolean useLoop(String[] arr, String targetValue) {
    	for(String s: arr){
    		if(s.equals(targetValue))
    			return true;
    	}
    	return false;
    }

    4) Using Arrays.binarySearech():

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

    2. Time Complexity

    The approximate time complexity can be compared by using the following code. It is not precise, just search an array of size 5, 1k, 10k, but the idea is clear.

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

    Result:

    useList:  13
    useSet:  72
    useLoop:  5
    useArraysBinarySearch:  9
    

    Use a larger array (1k):

    String[] arr = new String[1000];
     
    Random s = new Random();
    for(int i=0; i< 1000; i++){
    	arr[i] = String.valueOf(s.nextInt());
    }

    Result:

    useList:  112
    useSet:  2055
    useLoop:  99
    useArrayBinary:  12
    

    Use a larger array (10k):

    String[] arr = new String[10000];
     
    Random s = new Random();
    for(int i=0; i< 10000; i++){
    	arr[i] = String.valueOf(s.nextInt());
    }

    Result:

    useList:  1590
    useSet:  23819
    useLoop:  1526
    useArrayBinary:  12
    

    Clearly, using a simple loop method is more efficient than using any collection. A lot of developers use the first method, but it is inefficient. Pushing the array to another Collection type will require spin through all elements to read them in before doing anything with the collection type.

    The array must be sorted, if Arrays.binarySearch() method is used. In this case, the array is not sorted, therefore, it should not be used.

    Actually, if you really need to check if a value is contained in some array/collection efficiently, a sorted list or tree can do it in O(log(n)) or hashset can do it in O(1).

    reference from:http://www.programcreek.com/2014/04/check-if-array-contains-a-value-java/

  • 相关阅读:
    利用HttpModule做流量记录
    VS2010 调试出现 asp.net development server 错误
    利用win7自带的虚拟WIFI网卡,与其他设备共享网络
    关于 ASP 中使用 Server.CreateObject("ADODB.Stream") 上传文件报错
    lightweight jobs
    YOLO v3 包括Tiny-Yolo 训练自己的数据集(Pytorch版本)以及模型评价指标的介绍
    Sublime Text3 下载安装与激活使用
    QT中自定义封装控件笔记
    19_7_25-7_27 暑假学校收获
    数字图像处理基础知识2
  • 原文地址:https://www.cnblogs.com/davidwang456/p/3653360.html
Copyright © 2011-2022 走看看