1

オブジェクトの ArrayList を並べ替えるために Collections.sort を使用しています。私がやろうとしていることに対して、より効率的な compareTo メソッドがあるかどうかを確認したいと思います。

メソッドは次のとおりです。

@Override
public int compareTo(Song s) {
    if (runningTime > s.runningTime) {
        return -1;
    } else if (runningTime < s.runningTime) {
        return 1;
    }
    int lastCmp = title.compareTo(s.title);
    return (lastCmp != 0 ? lastCmp : composer.compareTo(s.composer));
}

誰かがより効率的な方法 (つまり、より速い実行時間) を提案できれば、私は非常に感謝しています。

4

4 に答える 4

2

曲の順序の優先順位が固定されていると仮定すると (実行時間、実行時間が同じ場合はタイトル、実行時間とタイトルが同じ場合は composer)、これ以上改善できることはあまりありません。優先順位が固定されていない場合は、タイトルの前に composer でテストすると、処理が少し速くなる可能性があります。実際のデータによって異なります。文字列比較よりも常に高速になるため、最初に実行時間のテストを続けます。

于 2011-05-29T03:43:33.107 に答える
2

MeBigFatGuy が言ったように、改善は重要ではありませんが、不要な if-else 条件を減らすためにコードを少しクリーンアップできると思います。私の2セント。

public int compareTo(Song s) {
    if (runningTime != s.runningTime) {
        return s.runningTime - runningTime;
    }
    else {
        int lastCmp = title.compareTo(s.title);
        return (lastCmp != 0 ? lastCmp : composer.compareTo(s.composer));
    }
}
于 2011-05-29T03:55:42.203 に答える
0

プロパティ値の読み取りにかかる時間によっては、 runningTime とs.runningTimeを最初にローカル変数に格納した方が少し速い場合があります。したがって、平均して、呼び出しごとに 1.5 回以上読み取るのではなく、呼び出しごとに 1 回だけ読み取ることになります。

于 2014-04-24T16:43:02.160 に答える
0

私にも元気に見えます。パフォーマンスの問題が発生している場合は、並べ替えの頻度が高すぎないかどうかを確認してください。Collections.sort がこれに敏感かどうかは今のところわかりませんが、数曲だけ挿入した後で既にソートされたリストに頼らないと、sth が得られる可能性があります

于 2011-05-29T05:56:33.077 に答える