ほげにっき

hogedigoの日記

ComparableとかComparatorとか

Comparable#compareToとかComparator#compareとか、比較メソッドで戻り値にintを返すものがある。
例えば前者でa.compareTo(b)とした場合、戻り値はa>bならば正の数、a*1で、文面だけで覚えていると使うとき(または読むとき)に少し考えてしまう、という人も多いだろう。実際隣のプログラマはソースを見て結果を即答できなかった。
実はちょっとしたコツを知っていると、この仕様はとても便利なのだ。
とにかく戻り値を、右辺を0にして比較する。そうすると、その0との比較演算子がオブジェクト(上記で言うaとb)間の関係と同じになる。

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

わかりやすいでしょ?


0を左辺に置くと比較演算子は当然逆になってしまうので注意。
残念なことに・・現在自分が参画しているプロジェクトでは比較演算子の方向をless thanに統一する、という規約がある為、

0 <= a.compareTo(b)

などと書かなければならない。ちょっとだけどストレスを感じて残念。

*1:C言語由来の仕様である