Java數組特定值高效判斷方法
如何檢查一個數組(無序)是否包含一個特定的值?這是一個在Java中經常用到的並且非常有用的操作。同時,這個問題在Stack Overflow中也是一個非常熱門的問題。在投票比較高的幾個答案中給出了幾種不同的方法,但是他們的時間複雜度也是各不相同的`。以下僅供參考!
檢查數組是否包含某個值的方法
使用List
public static boolean useList(String[] arr, String targetValue) {
return st(arr)ains(targetValue);
}
使用Set
public static boolean useSet(String[] arr, String targetValue) {
Setset = new HashSet(st(arr));
return ains(targetValue);
}
使用循環判斷
public static boolean useLoop(String[] arr, String targetValue) {
for(String s: arr){
if(ls(targetValue))
return true;
}
return false;
}
使用rySearch()
rySearch()方法只能用於有序數組!!!如果數組無序的話得到的結果就會很奇怪。
查找有序數組中是否包含某個值的用法如下:
public static boolean useArraysBinarySearch(String[] arr, String targetValue) {
int a = rySearch(arr, targetValue);
if(a > 0)
return true;
else
return false;
}
時間複雜度
下面的代碼可以大概的得出各種方法的時間成本。基本思想就是從數組中查找某個值,數組的大小分別是5、1k、10k。這種方法得到的結果可能並不精確,但是最簡單清晰的方式。
public static void main(String[] args) {
String[] arr = new String[] { "CD", "BC", "EF", "DE", "AB"};
//use list
long startTime = Time();
for (int i = 0; i < 100000; i++) {
useList(arr, "A");
}
long endTime = Time();
long duration = endTime - startTime;
tln("useList: " + duration / 1000000);
//use set
startTime = Time();
for (int i = 0; i < 100000; i++) {
useSet(arr, "A");
}
endTime = Time();
duration = endTime - startTime;
tln("useSet: " + duration / 1000000);
//use loop
startTime = Time();
for (int i = 0; i < 100000; i++) {
useLoop(arr, "A");
}
endTime = Time();
duration = endTime - startTime;
tln("useLoop: " + duration / 1000000);
//use rySearch()
startTime = Time();
for (int i = 0; i < 100000; i++) {
useArraysBinarySearch(arr, "A");
}
endTime = Time();
duration = endTime - startTime;
tln("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++){
arr[i] = eOf(Int());
}
結果:
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++){
arr[i] = eOf(Int());
}
結果:
useList: 1590
useSet: 23819
useLoop: 1526
useArrayBinary: 12
總結
顯然,使用一個簡單的循環方法比使用任何集合都更加高效。許多開發人員為了方便,都使用第一種方法,但是他的效率也相對較低。因為將數組壓入Collection類型中,首先要將數組元素遍歷一遍,然後再使用集合類做其他操作。
如果使用rySearch()方法,數組必須是已排序的。由於上面的數組並沒有進行排序,所以該方法不可使用。
實際上,如果你需要藉助數組或者集合類高效地檢查數組中是否包含特定值,一個已排序的列表或樹可以做到時間複雜度為O(log(n)),hashset可以達到O(1)。
-
如何使用一個java
Java是一種可以撰寫跨平台應用程序的`面向對象的程序設計語言。以下是小編為大家搜索整理的如何使用一個java,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!...
-
jsp向cookie寫入中文亂碼的解決辦法
jsp在向cookie寫入中文亂碼大家是怎麼處理的呢?下面是小編給大家提供的解決辦法,大家可以參考閲讀,更多詳情請關注應屆畢業生考試網。在jsp中對中文的處理有一點不好就可能出現亂碼了,下面我來給大家介紹jsp中向cookie寫入中文實現程序有需要了解的`朋友可參考。Co...
-
java知識點詳細總結大綱
沒有風浪,便沒有勇敢的弄潮兒;沒有荊棘,也沒有不屈的開拓者。以下是小編為大家搜索整理了java知識點詳細總結,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!一:java概述:1991年Sun公司的JamesGosling等人開始開發名稱為Oak的語言,希望用於控制...
-
java環境變量設置path
導語:java的環境變量是怎麼設置的呢?以下小編為大家介紹java環境變量設置path文章,僅供參考!java環境變量設置path環境變量是一個具有特定名字的對象,它包含了一個或者多個應用程序所將使用到的信息。例如path,當要求系統運行一個程序而沒有告訴它程序所在的完整路...