引数として一般的な配列をとるジェネリックメソッド内のcompareToを実装する方法?

WebStormer:

私は、一般的な配列を与えられた、という、メソッドを実装しようとしているし、2つのインデックス値は、配列をスライスし、2つの与えられた数の間の最大の要素を見つけます。

<T extends Comparable<? super T>> T max(T[] array, int firstIndx, int secondIndx) {        //requires comparable
    T maxElement = array[0];      //8
    System.out.println(Arrays.toString(array));

    for (int i = firstIndx; i < secondIndx - 1; i++) {
        for (int j = firstIndx + 1; j < secondIndx; j++) {
            if (array[i].compareTo(array[j]) > 0) {
                maxElement = array[i];
                array[i] = array[j];
                array[j] = maxElement;
            }
        }
    }

    System.out.println(Arrays.toString(array));
    return maxElement;
}

しかしintのアレイ[8、4、6、20、1]のために、私は間違った最大要素を与え、正しくちょうど最初の2つの要素を交換しています。コードが間違っては何ですか?

ヨルダン:

あなたのソートには2つの問題があります。最初は、あなたが使用していることであるfirstIndxsecondIndx、それは第2の指標であるかのようにあなたのコードが構成されている方法に基づいて、それは、第2の数を処理することだマイナス1

第二の問題は、あなたの内側のループがで戻って開始されていることであるfirstIndxバブルソートを破るたびに、。それはに開始する必要がありますi

ループのためにあなたにこの変更をお試しください:

for (int i = firstIndx; i <= secondIndx - 1; i++) { // Notice the "<=".
    for (int j = i + 1; j <= secondIndx; j++) { // j starts at i
    // ... existing bubble sort code goes here
    }
}

編集:私は、最大でそのソート位置にすでにある場合は、あなたのアプローチは、最大を見つけることができませんことを言及しませんでした。あなただけの最高をつかむ必要がありarray[secondIndx]ますが、ソート終わった後。


余談として、firstIndxかなり悪い変数名です。これは、完全にそれを書くためにのみ1文字以上です:firstIndex

おすすめ

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