Mooncrater:
私は、検索を実行したい整数のソートされた配列を持っています。この配列は、繰り返される値を持つことができます。私が繰り返される要素を検索する場合、それは要素の最初のインスタンスのインデックスを返す必要があります。
私が使用している場合Arrays.binarySearch()
、それは必ずしも、検索要素の最初のインスタンスのインデックスを与えるものではありません。例を見ることができ、ここで:
int[] A = {10,20,21,24,24,24,24,24,30,40,45} ;
int idx = Arrays.binarySearch(A,24) ;
ここで、idx
となります5
。私はそれになりたいです3
。私はクラスを作ることによって、以前、この問題を解決するPair
ように:
class Pair implements Comparable<Pair>
{
int value, index ;
Pair(int v,int i)
{
this.value = v ;
this.index = i ;
}
@Override
public int compareTo(Pair p)
{
if(p.value<this.value)
return 1 ;
else if(p.value>this.value)
return -1 ;
else
{
if(p.index<this.index)
return 1 ;
else if(p.index>this.index)
return -1 ;
else return 0 ;
}
}
}
どちらで検索するときCollections.binarySearch(new Pair(24,Integer.MIN_VALUE))
(のリストのためPair
の)返します3
。コードは次のようになります。
int[] A = {10,20,21,24,24,24,24,24,30,40,45} ;
List<Pair> L = new ArrayList<Pair>() ;
for(int i=0;i<A.length;i++)
{
L.add(new Pair(A[i],i)) ;
}
int idx = Collections.binarySearch(L,new Pair(24,Integer.MIN_VALUE)) ;
if(idx<0) idx = -idx-1 ;
System.out.println(idx) ;
Pair
このように動作します:それは二つの変数があるvalue
とindex
ソートされた配列の要素の値、および配列の要素のインデックスです。compareTo
この方法は、可能にするためにオーバーライドされてCollections.binarySearch()
比較を実行します。比較は次のように定義することができます。
- 現在の場合は
value
大きいか小さい場合、注文はによって決定されますvalue
。 - 場合は
value
、Sが同じである場合、順序が使用して決定されますindex
。
私の質問は、これはそれほど厄介な方法で行うことができますか?短いものは、いただければ幸いです!
ユーゴスラビア・シン:
コードの以下の部分を見てみましょう。オリジナルのバイナリ検索コードを変更した:l
そしてr
、それぞれ左と右の範囲です
public static int binarySearch(int[] arr, int num, int l,int r) {
int mid = (l+r)/2;
if(arr[mid] == num && (mid>0&& arr[mid-1]!=num) || mid==0) {
return mid;
}
else if(arr[mid] > num || (mid > l && arr[mid] == num && arr[mid-1] == num)) {
return binarySearch(arr, num, l, mid);
}else {
return binarySearch(arr, num, mid, r);
}
}