コンパレータを実装する必要があるたびに、いつ -1 を返す必要があるか、いつ 1 を返す必要があるかを覚えようとして行き詰まり、調べなければなりません。
つまり、明らかに -1 はより小さいfirst
ので、より小さいことを意味しsecond
ます。でも、そんなことを自分に言い聞かせると、「本当ですか?」としつこく言われます。フィーリング。私の混乱の一部は、降順ソートが必要なときはいつでも逆に実装することから来ていると思います。
どちらがどちらであるかを覚えるために何を使用しますか?
コンパレータを実装する必要があるたびに、いつ -1 を返す必要があるか、いつ 1 を返す必要があるかを覚えようとして行き詰まり、調べなければなりません。
つまり、明らかに -1 はより小さいfirst
ので、より小さいことを意味しsecond
ます。でも、そんなことを自分に言い聞かせると、「本当ですか?」としつこく言われます。フィーリング。私の混乱の一部は、降順ソートが必要なときはいつでも逆に実装することから来ていると思います。
どちらがどちらであるかを覚えるために何を使用しますか?
この単純な「減算」ニーモニックを使用します。
first - second
したがって、first
「小さい」場合はsecond
負の結果が得られます。そうでない場合は、正または等しい場合はゼロになります。
comparator.compare(a, b) < 0
<==>a < b
ニーモニックの意味がわかりません。しかし、私は非常によく似た認知的不協和を経験しました。
私は非常に視覚的なので、数直線 (小学校で教わったもの) を使用します。負の数を「左」、0 を「中央」、正の数を「右」として視覚化します。が真実に対応すること: -1 < 0 < 1
基本整数のケース (疑似コード) を覚えています。
int comparator(int a, int b) {
return a-b;
}
したがって、最初の < 最後である小さなものa
と大きなものを与えるとb
、負の結果が得られます。
私はより視覚的な記憶を持っているので、その機能の「構造」を思い出すことは私にとって簡単で自然なことです。
Comparator
とComparable
インターフェースを実装するときは、常にドキュメントを確認していました。
質問: 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;
}