ある配列があって、その中にある要素があるかどうかを調べようとしたときに、 今まで私は、以下のようなソースを書いていました。
String[] days = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
String aDay = "Tue";
int i;
for (i=0 ; i<days.length ; i++) {
if (days[i].equals(aDay)){
break;
}
}
// daysに含まれていたかを表示
System.out.println((i < days.length) ? "曜日です。" : "曜日ではない。");
// 何番目と一致したかを表示
System.out.println(i + "番目と一致");
しかし、上記のdays配列は、専らそれが曜日に該当するかどうかに該当するかどうかに使用され、 aDaysが曜日かどうかだけがわかればいいというようなプログラムの場合、以下のように書くことができます。 (この書き方は、Javaネットワークプログラミングの真髄のコード片で普通に使われていました。)
String[] days = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
String aDay = "Tue";
Arrays.sort(days);
int n = Arrays.binarySearch(days, aDay);
System.out.println((n>0) ? "曜日です。" : "曜日ではない。");
このソースでは、一度days配列をソートしています。 そしてArrays#binarySearchメソッドを呼び出して、aDayがdaysの要素のいずれかと一致するかどうかを調べるわけです。
前者で挙げたサーチは、days配列の順番を変更してはいけない場合や、
プログラム中で1度か2度しかサーチしない場合に有効です。
後者で挙げたサーチは、days配列の順番を変更してもよく、
プログラム中で何度も使用される場合に有効です。しかも一度ソートしてしまえば、サーチ処理は1行で書けますから、
可読性もよくなります。(可読性は重要です!)
前者の欠点は、毎回サーチするたびに配列のすべての要素について比較しているので、
1サーチ辺りに要する時間が長いです。
後者の欠点は、最初のソートに時間を要するのと、days配列の中身をソートしなければいけない点です。
両者は一長一短があり、適切に使い分けるといいでしょう。