web-dev-qa-db-ja.com

Java内の「<」または「>」演算子を使用して2つのオブジェクトを比較する

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

唯一の方法?

16
IvanN

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
}
_
19
Anderson Vieira

Comparable.compareTo(T) を使用することが唯一のオプションです(または Comparator )。インターフェイスはその1つのメソッドのみを定義し(Comparatorequalsを追加する間)、それはこのオブジェクトと指定されたオブジェクトの順序を比較しますさらに、Javaは演算子のオーバーロードを許可していません(そのため、そのメソッドの呼び出しに使用されるオペランドを直接変更したり、実際にインターフェースを変更したりすることはできません)。

3
Elliott Frisch

それが唯一の方法ではありません。コンパレータも実装できます。コンパレータは、compare()メソッドを使用するComparableとは対照的に、compareTo()メソッドを使用します。

_>_または_<_を使用してオブジェクトを直接比較できないのは、Javaが比較に使用する変数を認識しないためです(オブジェクト内に複数の変数が存在する場合があります)。

オブジェクトを比較するために、それらのオブジェクトは比較可能でなければなりません。 Javaそれらを比較する方法を定義して伝える必要があります。

Javaコレクションはsortメソッドを提供します。ただし、一部の学校では、最終的にcompareTo()を比較に使用する独自の並べ替えメソッドを作成するように依頼する割り当てを提供しています。

ComparableComparatorの微妙な違いについては、こちらをご覧ください。 compare()とcompareTo()の違いは何ですか?


compareTo()メソッドをオーバーライドしなかった場合、デフォルトではJavaは文字列(オブジェクト)を辞書順に比較します)にも言及する価値があると思います。

2
user3437460