Javaで2つのオブジェクトを「<」または「>」を使用して比較できるようにする方法。例:.
MyObject<String> obj1= new MyObject<String>(“blablabla”, 25);
MyObject<String> obj2= new MyObject<String>(“nannaanana”, 17);
if (obj1 > obj2)
do something.
MyObjectクラスのヘッダーを
public class MyObject<T extends Comparable<T>> implements Comparable<MyObject<T>>
および作成されたメソッドCompですが、オブジェクトのリストで「ソート」を使用できるようになりましたが、2つのオブジェクトを直接比較するにはどうすればよいですか?です
if(obj1.compareTo(obj2) > 0)
do something
唯一の方法?
Javaでは演算子のオーバーロードはできません。これは、独自のクラスで_+
_、_>
_、_<
_、_==
_などの演算子のカスタム動作を定義できないことを意味します。
すでにお気づきのように、Comparable
を実装し、compareTo()
メソッドを使用するのが、おそらくこの場合の方法です。
もう1つのオプションは、Comparator
を作成することです( docs を参照)。特に、クラスがComparable
を実装することが意味をなさない場合、または比較する必要がある場合異なる方法で同じクラスのオブジェクト。
コードを読みやすくするために、compareTo()
をより自然に見えるカスタムメソッドと組み合わせて使用できます。例えば:
_boolean isGreaterThan(MyObject<T> that) {
return this.compareTo(that) > 0;
}
boolean isLessThan(MyObject<T> that) {
return this.compareTo(that) < 0;
}
_
その後、次のように使用できます。
_if (obj1.isGreaterThan(obj2)) {
// do something
}
_
Comparable.compareTo(T)
を使用することが唯一のオプションです(または Comparator
)。インターフェイスはその1つのメソッドのみを定義し(Comparator
がequals
を追加する間)、それはこのオブジェクトと指定されたオブジェクトの順序を比較しますさらに、Javaは演算子のオーバーロードを許可していません(そのため、そのメソッドの呼び出しに使用されるオペランドを直接変更したり、実際にインターフェースを変更したりすることはできません)。
それが唯一の方法ではありません。コンパレータも実装できます。コンパレータは、compare()
メソッドを使用するComparable
とは対照的に、compareTo()
メソッドを使用します。
_>
_または_<
_を使用してオブジェクトを直接比較できないのは、Javaが比較に使用する変数を認識しないためです(オブジェクト内に複数の変数が存在する場合があります)。
オブジェクトを比較するために、それらのオブジェクトは比較可能でなければなりません。 Javaそれらを比較する方法を定義して伝える必要があります。
Javaコレクションはsort
メソッドを提供します。ただし、一部の学校では、最終的にcompareTo()
を比較に使用する独自の並べ替えメソッドを作成するように依頼する割り当てを提供しています。
Comparable
とComparator
の微妙な違いについては、こちらをご覧ください。 compare()とcompareTo()の違いは何ですか?
compareTo()
メソッドをオーバーライドしなかった場合、デフォルトではJavaは文字列(オブジェクト)を辞書順に比較します)にも言及する価値があると思います。