-1

配列で n 番目に大きい数値を返すコードを実装していました。以下は実装したコードです。

public int getNthLargestNum(int [] givenArr, int n){

    int nTotal=0;
    int nNthNum = -1;

    // Remove Duplicates
    Set<Integer> o_hs = new TreeSet<Integer>();
    for(int insert=0; insert<givenArr.length; insert++)
    {o_hs.add(givenArr[insert]);}

    Iterator it  = o_hs.iterator();
    int count=0;

    while(it.hasNext()){
        if(count == n){

        // IF I MOVE THE LINE HERE
        // nNthNum = (Integer)it.next();

            break;
        }
        nNthNum = (Integer)it.next();
        count++; 
    }

return nNthNum;    
}

配列 givenArr[4,14,4,5,6,8,9] と n=2 を入力すると、上記のプログラムの出力は 5 になりますが、行 nNthNum = (Integer)it.next(); を移動すると、出力は 5 になります。if ループ内では 4 が出力されます。

そのため、常に it.next() を実装する必要があるループを反復処理する方法を知りたいと思っていました。

4

2 に答える 2

1

AHashSetは本質的に順序付けされていないため、セットから N 番目の項目を取得しても意味がありません。どのような価値が得られるかわかりません。アルゴリズムは本質的に任意です。代わりに、並べ替えられた配列を反復して N 番目に大きい値を取得するか、順序付けされていないTreeSetaを使用します。

ソートされたセット内のデータ全体が実際には必要ないため、セットからアイテムを削除できます。技術的には、各操作が O(1) である場合、セットには最大 5 つのアイテムしかないため、アルゴリズム全体が O(n) になります。

public int getNthLargestNum(int[] data, int n){
    TreeSet<Integer> set = new TreeSet<Integer>();
    foreach(int number : data)
    {
        set.add(number);
        if(set.size() > 5)
            set.pollFirst();
    }

    return set.first();
}
于 2013-07-01T20:37:47.823 に答える
0

はい、そうしないとit.next()、コレクションの次の要素がフェッチされません。

it.hasNext()呼び出しは、コレクション内の次の要素へのポインターを進めません。

于 2013-07-01T20:35:41.677 に答える