陣列是否包含某個元素

2021-08-21 07:45:19 字數 3752 閱讀 4730

一、檢查陣列是否包含某個值的方法

使用list

public

static

boolean

uselist(string arr, string targetvalue)

使用set

public static boolean useset(string arr, string targetvalue)
使用迴圈判斷

public

static

boolean

useloop(string arr, string targetvalue)

return

false;

}

使用arrays.binarysearch()

arrays.binarysearch()方法只能用於有序陣列!!!如果陣列無序的話得到的結果就會很奇怪。

查詢有序陣列中是否包含某個值的用法如下:

public

static

boolean

usearraysbinarysearch(string arr, string targetvalue)

時間複雜度

下面的**可以大概的得出各種方法的時間成本。基本思想就是從陣列中查詢某個值,陣列的大小分別是5、1k、10k。這種方法得到的結果可能並不精確,但是是最簡單清晰的方式。

public

static

void

main(string args) ;

//use list

long starttime = system.nanotime();

for (int i = 0; i < 100000; i++)

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

endtime = system.nanotime();

duration = endtime - starttime;

system.out.println("useset: " + duration / 1000000);

//use loop

starttime = system.nanotime();

for (int i = 0; i < 100000; i++)

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

endtime = system.nanotime();

duration = endtime - starttime;

system.out.println("usearraybinary: " + duration / 1000000);

}

執行結果:

uselist: 13

useset: 72

useloop: 5

usearraysbinarysearch: 9

使用乙個長度為1k的陣列

string arr = new

string[1000];

random s = new random();

for(int i=0; i< 1000; i++)

結果:

uselist: 112

useset: 2055

useloop: 99

usearraybinary: 12

使用乙個長度為10k的陣列

string arr = new

string[10000];

random s = new random();

for(int i=0; i< 10000; i++)

結果:

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;

public

static

boolean

usearrayutils(string arr, string 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)  else 

int i;

if(objecttofind == null)

}} else

if(array.getclass().getcomponenttype().isinstance(objecttofind)) }}

return -1;

}

所以,相比較之下,我更傾向於使用arrayutils工具類來進行一些合數祖相關的操作。畢竟他可以讓我少寫很多**(因為自己寫**難免有bug,畢竟apache提供的開源工具類庫都是經過無數開發者考驗過的),而且,效率上也並不低太多。

總結

判斷陣列中是否包含某個元素 iOS

日常開發中經常會遇到陣列中是否包含某個元素的情況,api 中扒一扒方法後,如下方法可以簡單便捷的遍歷出來,具體 code 如下 方法一 nsstring key receipt bool isbool arrdata containsobject key if isbool else方法二 nsin...

js判斷陣列中是否包含某個元素

參考 js判斷陣列中是否包含某個元素 inarray value,array fromindex value 任意型別 用於查詢的值。array array型別 指定被查詢的陣列。fromindex 可選。number型別 指定從陣列的指定索引位置開始查詢,預設為 0示例 var a a b c d...

node js 判斷陣列中是否包含某個值

判斷陣列中是否包含某個值這裡有四種方法。用的測試資料 let arr a b c let arr2 in操作符針對的是key,而非value。而對於普通的一維陣列來說,key是隱藏的。所以,對於判斷某個陣列中是否含有某個值來說,這個方案並不合適。console.log 1 a in arr fals...