14

コンパレータを実装する必要があるたびに、いつ -1 を返す必要があるか、いつ 1 を返す必要があるかを覚えようとして行き詰まり、調べなければなりません。

つまり、明らかに -1 はより小さいfirstので、より小さいことを意味しsecondます。でも、そんなことを自分に言い聞かせると、「本当ですか?」としつこく言われます。フィーリング。私の混乱の一部は、降順ソートが必要なときはいつでも逆に実装することから来ていると思います。

どちらがどちらであるかを覚えるために何を使用しますか?

4

5 に答える 5

10

この単純な「減算」ニーモニックを使用します。

first - second

したがって、first「小さい」場合はsecond負の結果が得られます。そうでない場合は、正または等しい場合はゼロになります。

于 2011-03-30T14:00:49.060 に答える
6

comparator.compare(a, b) < 0<==>a < b

于 2011-03-30T14:18:06.750 に答える
5

ニーモニックの意味がわかりません。しかし、私は非常によく似た認知的不協和を経験しました。

私は非常に視覚的なので、数直線 (小学校で教わったもの) を使用します。負の数を「左」、0 を「中央」、正の数を「右」として視覚化します。が真実に対応すること: -1 < 0 < 1

于 2011-03-30T14:02:27.780 に答える
2

基本整数のケース (疑似コード) を覚えています。

int comparator(int a, int b) {
   return a-b;
}

したがって、最初の < 最後である小さなものaと大きなものを与えるとb、負の結果が得られます。

私はより視覚的な記憶を持っているので、その機能の「構造」を思い出すことは私にとって簡単で自然なことです。

于 2011-03-30T14:02:44.837 に答える
0

ComparatorComparableインターフェースを実装するときは、常にドキュメントを確認していました。

質問: a と b を比較
します。最初に昇順を見てみましょう。なぜなら、降順は私たちが行うことの逆になるからです。
問題は与えられた 2 つの数 a と b に変換できます。それらを数直線にどのように配置しますか?
a < b の場合はa、マイナス側とbプラス側に配置します。
それ以外の場合、a = b の場合、両方を中央 (0)に配置します。
そうでない場合bは、マイナス側になりa、プラス側になります。

ここに画像の説明を入力

コンパレータの実装:
ここでは と比較aしていbます。

 @Override
    public int compare(MyClass a, MyClass b) { //always good to rename your variables like this to be consistent 
        return a.f1 - b.f1; 
    }

比較可能な実装:
ここでは と比較thisしていotherます。

@Override
    public int compareTo(MyClass other) { // this is same as compare(this, other)
        return this.f1 - o.f1;
    }
于 2020-12-22T18:56:07.803 に答える