Java中如何高效的判斷陣列中是否包含某個元素
如何檢查一個數組(無序)是否包含一個特定的值?這是一個在Java中經常用到的並且非常有用的操作。同時,這個問題在Stack Overflow中也是一個非常熱門的問題。在投票比較高的幾個答案中給出了幾種不同的方法,但是他們的時間複雜度也是各不相同的。本文將分析幾種常見用法及其時間成本。
檢查陣列是否包含某個值的方法
使用List
publicstaticboolean useList(String[] arr,String targetValue){returnArrays.asList(arr).contains(targetValue);}
使用Set
publicstaticboolean useSet(String[] arr,String targetValue){Set<String>set=newHashSet<String>(Arrays.asList(arr));returnset.contains(targetValue);}
使用迴圈判斷
publicstaticboolean useLoop(String[] arr,String targetValue){for(String s: arr){if(s.equals(targetValue))returntrue;}returnfalse;}
使用Arrays.binarySearch()
Arrays.binarySearch()方法只能用於有序陣列!!!如果陣列無序的話得到的結果就會很奇怪。
查詢有序陣列中是否包含某個值的用法如下:
publicstaticboolean useArraysBinarySearch(String[] arr,String targetValue){int a =Arrays.binarySearch(arr, targetValue);if(a >0)returntrue;elsereturnfalse;}
時間複雜度
下面的程式碼可以大概的得出各種方法的時間成本。基本思想就是從陣列中查詢某個值,陣列的大小分別是5、1k、10k。這種方法得到的結果可能並不精確,但是是最簡單清晰的方式。
publicstaticvoid main(String[] args){String[] arr =newString[]{"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 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);}
執行結果:
useList:13
useSet:72
useLoop:5
useArraysBinarySearch:9
使用一個長度為1k的陣列
String[] arr =newString[1000];Random s =newRandom();for(int i=0; i<1000; i++){
arr[i]=String.valueOf(s.nextInt());}
結果:
useList:112
useSet:2055
useLoop:99
useArrayBinary:12
使用一個長度為10k的陣列
String[] arr =newString[10000];Random s =newRandom();for(int i=0; i<10000; i++){
arr[i]=String.valueOf(s.nextInt());}
結果:
useList:1590
useSet:23819
useLoop:1526
useArrayBinary:12
總結
顯然,使用一個簡單的迴圈方法比使用任何集合都更加高效。許多開發人員為了方便,都使用第一種方法,但是他的效率也相對較低。因為將陣列壓入Collection型別中,首先要將陣列元素遍歷一遍,然後再使用集合類做其他操作。
如果使用Arrays.binarySearch()
方法,陣列必須是已排序的。由於上面的陣列並沒有進行排序,所以該方法不可使用。
實際上,如果你需要藉助陣列或者集合類高效地檢查陣列中是否包含特定值,一個已排序的列表或樹可以做到時間複雜度為O(log(n)),hashset可以達到O(1)。
(英文原文結束,以下是譯者注)
使用ArrayUtils
除了以上幾種以外,Apache Commons類庫中還提供了一個ArrayUtils
類,可以使用其contains
方法判斷陣列和值的關係。
import org.apache.commons.lang3.ArrayUtils;publicstaticboolean useArrayUtils(String[] arr,String targetValue){returnArrayUtils.contains(arr,targetValue);}
同樣使用以上幾種長度的陣列進行測試,得出的結果是該方法的效率介於使用集合和使用迴圈判斷之間(有的時候結果甚至比使用迴圈要理想)。
useList:323
useSet:3028
useLoop:141
useArrayBinary:12
useArrayUtils:181-------
useList:3703
useSet:35183
useLoop:3218
useArrayBinary:14
useArrayUtils:3125
其實,如果檢視ArrayUtils.contains
的原始碼可以發現,他判斷一個元素是否包含在陣列中其實也是使用迴圈判斷的方式。
部分程式碼如下:
if(array ==null){return-1;}else{if(startIndex <0){
startIndex =0;}int i;if(objectToFind ==null){for(i = startIndex; i < array.length;++i){if(array[i]==null){return i;}}}elseif(array.getClass().getComponentType().isInstance(objectToFind)){for(i =
相關推薦
Java中高效判斷陣列中是否包含某個元素。
如何檢查一個數組(無序的)是否包含一個特定的值呢?這是一個在Java中經常用到的並且非常有用的操作。本文將分析幾種常見用法及其時間成本。1、使用 ava.util.Arrays.asList(arr)
在Java中如何高效判斷陣列中是否包含某個元素
如何檢查一個數組(無序)是否包含一個特定的值?這是一個在Java中經常用到的並且非常有用的操作。同時,這個問題在Stack Overflow中也是一個非常熱門的問題。在投票比較高的幾個答案中給出了幾種不同的方法,但是他們的時間複雜度也是各不相同的。本文將分析
java中如何高效判斷陣列中是否包含某個特定的值
四種不同方式檢查陣列是否包含某個值
使用List:
public static boolean useList(String[] arr, String targetValue) {
判斷js陣列包是否包含某個元素
要判斷陣列中是否包含某個元素,從原理來來說,就是遍歷整個陣列,然後判斷是否相等,我們來造個輪子,名字就山寨PHP的陣列函式in_array()
Array.prototype.in_array = function(e)
{
for(i=0;i<this.length;
Java中如何高效的判斷陣列中是否包含某個元素
如何檢查一個數組(無序)是否包含一個特定的值?這是一個在Java中經常用到的並且非常有用的操作。同時,這個問題在Stack Overflow中也是一個非常熱門的問題。在投票比較高的幾個答案中給出了幾種不同的方法,但是他們的時間複雜度也是各不相同的。本文將分析幾種常見用法
java中如何高效的判斷陣列中是否包含某個元素---
package zaLearnpackage;
import org.apache.commons.lang3.ArrayUtils;
import java.util.Arrays;
import java.util.HashSet;
import java.uti
在Java中如何高效判斷數組中是否包含某個元素
clas AC ray 而且 一個 nan 使用 一個數 component 如何檢查一個數組(無序)是否包含一個特定的值?這是一個在Java中經常用到的並且非常有用的操作。同時,這個問題在Stack Overflow中也是一個非常熱門的問題。在投票比較高的幾個答案中給出了
java如何判斷陣列中是否包含某元素
有兩種方法可以判斷陣列是否包含元素:
方法1, 將陣列轉換為list,然後使用list的contains方法來判斷:
Arrays.asList(...).contains(...)
方法2,遍歷陣列判斷:
publicstatic<T>boolean c
Query判斷陣列中是否包含某個元素
JQuery判斷陣列中是否包含某個元素使用$.inArray("js", arr);
var arr = [ "xml", "html", "css", "js" ];
$.in
獲取表格中列值時,空格符也會加進去,導致判斷陣列中是否包含列值時會返回false
//初始化已選優惠券編碼
var discountTbody=document.getElementById('discountTbody');
var discountRows=discountTbody.rows;
var selectCouponList=[];
console.l
判斷陣列中是否包含某元素,判斷字串中是否包含某字串
let arr = [1, 2, 3, 4];
if (arr.indexOf('1') > -1) {} //判斷1是否在陣列arr中,true=是
let str = string;
if (str.indexOf('t') !== -1) {}&nb
node js 判斷陣列中是否包含某個值
判斷陣列中是否包含某個值這裡有四種方法。 用的測試資料:
let arr=["a","b","c"];
let arr2={"a":"aaa","b":"bbb","c":"ccc"};
in判斷是否在陣列的key裡
in操作符針對的是key,而非value。而對於普通的一
判斷陣列中是否包含某個物件
要想比較需要重寫-isEqual:和-hash
當判斷anObject是否在當前的NSArray中的時候,是通過呼叫isEqual:這個方法來判斷的,isEqual:本質是在比較兩個物件的hash值
@interface Person
@property NSStrin
java 劍指offer 第一題:在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
我用了三種解法,全部都可以在牛客網上通過。
第一種解法是最簡單的,遍歷整個二維陣列找那個整數;
第二種和第三種都是根據二維陣列有序的特性進行查詢,第二種方法是從左下角開始查詢,大於左下角刪除一行,小於左下角刪除一列;第三種是從右上角開始查詢,大於右上角刪除一行,小於右上角的
Java 一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。判斷陣列中是否含有某個整數。
開始刷牛客題目:思路:題目已知:二維陣列由上到下,由左到右遞增的規律,那麼選取右上角(或者左下角)的元素a[row][col]與target進行比較,當target小於元素a[row][col]時,那麼target必定在元素a所在行的左邊,即col--;當target大於元素
java實現一個二維陣列,每一行從左到右遞增,每一列從上到下遞增,輸入一個二維陣列和一個整數,判斷陣列中是否有該整數
/**
* 給定二維陣列,尋找key值
*/public class FindKey { public static boolean findKey(int[][] arr,int key) {
if (arr == null) {
判斷陣列中是否包含重複數字
給定一個長度為N的陣列,其中每個元素的取值範圍都是1到N。判斷陣列中是否有重複的數字。(原陣列不必保留)
方法1.對陣列進行排序(快速,堆),然後比較相鄰的元素是否相同。時間複雜度為O(nlogn),空間複雜度為O(1)。方法2.使用bitmap方法。定義長度為N/8的ch
遞迴方法判斷陣列中的元素是否有序(Java實現)
import java.util.Scanner;
class IsSort {
public int isArrayInSortedOrder(int[] a, int index) {
if (index == 1) {
java去除兩個陣列中相同的元素
import java.util.*;
/**
* 陣列去重
* <p>
* Created by Cheung on 2016/4/14.
*/
public class Test01 {
public static void main(String[] args)
劍指offer——判斷陣列中出現次數過半的數值
根據題目,主要解決兩個問題,一個是判斷出現陣列出現的次數,二是輸出出現次數過半的數值,無則返回0。根據這種情況,腦中第一個出現的就是用字典解決,判斷value,輸出key。
class Solution:
def MoreThanHlafNum_Solution(self,number