値とインデックスで配列を検索します

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このように動作します:それは二つの変数があるvalueindexソートされた配列の要素の値、および配列の要素のインデックスです。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);
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=186122&siteId=1