1.配列に特定の値が含まれているかどうかを確認する方法
リストを使用します
public static boolean uselist(string [] arr、string targetvalue){return arrays.aslist(arr).contains(targetvalue);}セットを使用します
public static boolean useSet(string [] arr、string targetvalue){set <string> set = new hashset <string>(arrays.aslist(arr)); return set.contains(targetvalue);}ループ判断を使用します
public static boolean useloop(string [] arr、string targetvalue){for(string s:arr){if(s.equals(targetvalue))return true; } falseを返します;}arrays.binarysearch()を使用します
Arrays.binarySearch()メソッドは、順序付けられた配列にのみ使用できます! ! !配列が順序付けられていない場合、結果は非常に奇妙になります。
順序付けられた配列に特定の値が含まれているかどうかを見つけることの使用は次のとおりです。
public static boolean usearraysbinarysearch(string [] arr、string targetvalue){int a = arrays.binarysearch(arr、targetvalue); if(a> 0)trueを返します。それ以外の場合はfalse;}時間の複雑さ
次のコードは、さまざまな方法の時間コストを大まかに描画できます。基本的なアイデアは、配列から特定の値を見つけることであり、配列のサイズはそれぞれ5、1K、および10Kです。この方法で得られた結果は正確ではないかもしれませんが、最も単純で明確な方法です。
public static void main(string [] args){string [] arr = new String [] {"cd"、 "bc"、 "ef"、 "de"、 "ab"}; //リストlong starttime = system.nanotime(); for(int i = 0; i <100000; i ++){uselist(arr、 "a"); } long endtime = system.nanotime();長時間=終了時間 - 開始時刻。 System.out.println( "uselist:" + duration / 1000000); // set starttime = system.nanotime();を使用します。 for(int i = 0; i <100000; i ++){useSet(arr、 "a"); } endtime = system.nanotime();持続時間=終了時間 - 開始時刻; System.out.println( "ueseSet:" + duration / 1000000); // loop starttime = system.nanotime()を使用します。 for(int i = 0; i <100000; i ++){useloop(arr、 "a"); } endtime = system.nanotime();持続時間=終了時間 - 開始時刻; System.out.println( "useloop:" + duration / 1000000); // arrays.binarysearch()starttime = system.nanotime();を使用します。 for(int i = 0; i <100000; i ++){usearraysbinarysearch(arr、 "a"); } endtime = system.nanotime();持続時間=終了時間 - 開始時刻; system.out.println( "usearraybinary:" + duration / 1000000);}実行結果:
USELIST:13USESET:72USELOOP:5USEARRAYSBinarySearch:9
長さ1kの配列を使用します
string [] arr = new String [1000]; random S = new Random();
結果:
USELIST:112USESET:2055USELOOP:99USEARRAYBINARY:12
長さ10kの配列を使用します
string [] arr = new String [10000]; random S = new Random();
結果:
USELIST:1590USESET:23819USELOOP:1526USEARRAYBINARY:12
まとめ
明らかに、シンプルなループメソッドを使用すると、コレクションを使用するよりも効率的です。多くの開発者は、利便性のために最初の方法を使用していますが、その効率も比較的低いです。アレイをコレクションタイプに押すため、最初に配列要素を通過し、次にコレクションクラスを使用して他の操作を実行する必要があります。
Arrays.binarySearch()メソッドを使用する場合、配列をソートする必要があります。上記の配列はソートされていないため、この方法は使用できません。
実際、配列またはコレクションクラスを使用して、配列に特定の値が含まれているかどうかを効率的に確認する必要がある場合、ソートされたリストまたはツリーはO(log(n))の時間の複雑さを達成し、ハッシュセットはO(1)を達成できます。
arrayutilsを使用します
上記に加えて、Apache Commons Class LibraryはArrayutilsクラスも提供します。このクラスは、そのcontines方法を使用して配列と値の関係を判断できます。
Import org.apache.commons.lang3.arrayutils; public static boolean usearrayutils(string [] arr、string targetvalue){return arrayutils.contains(arr、targetvalue);}上記の長さの配列を使用して同じテストが実行され、その結果、この方法の効率はセットの使用とループ判断の使用の間にありました(結果はループを使用するよりもさらに理想的だった場合があります)。
USELIST:323USESET:3028USELOOP:141USEARRAYBINARY:12USEARRAYUTILS:181 ---------- USELIST:3703USESET:35183USELOOP:3218USEARRAYBINARY:14USEARRAYUTILS: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; }}} else if(array.getClass()。getComponentType()。isInstance(objectTofind)){for(i = startindex; i <array.length; ++ i){if(objecttofind.equals(array [i])){return i; }}} return -1; }したがって、それに比べて、私はArrayutilsツールクラスを使用して、複合数の祖先に関連するいくつかの操作を実行することを好みます。結局のところ、彼は私に多くのコードを少なくすることができます(独自のコードを書くときに必然的にバグがあるためです。結局、Apacheが提供するオープンソースツールライブラリは無数の開発者によってテストされています)、効率はそれほど低くありません。
要約します
OK、上記はこの記事に関するすべてです。この記事の内容が、誰もがJavaを学んだり使用したりするのに役立つことを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。