2

メソッドを使用して、オブジェクトの複数の唯一のフィールドを比較しますcompareTo。出来ますか?

たとえば:

public int compareTo(Object o) {
    return field.compareTo(o.field);
}

コレクションをソートするためにこのメソッドを作成します。明らかに、私のオブジェクトはComparableインターフェイスを実装する必要があります。

同じメソッド内の 1 つのフィールドだけでなく、比較できるかどうかを推測していcompareToます。

4

7 に答える 7

3

はい、可能です。たとえば、次のようにします。

public int compareTo(MyClass o){
  int ret = field1.compareTo(o.field1);
  if (ret != 0) return ret;
  ret = field2.compareTo(o.field2);
  if (ret != 0) return ret;
  ...
  return fieldN.compareTo(o.fieldN);
}
于 2011-12-13T15:10:41.043 に答える
3

はい、可能です。最初のフィールドを比較した結果がゼロを返した場合、2 番目のフィールドを比較した結果を返します。

public int compareTo(SomeClass o) {
    int result = field1.compareTo(o.field1);
    if ( result == 0 ) {
        result = field2.compareTo(o.field2);
    }
    return result;
}

これはすぐに面倒になるため、Guava はComparisonChain. 使用例:

public int compareTo(SomeClass o) {
    return ComparisonChain.start()
         .compare(field1, o.field1)
         .compare(field2, o.field2)
         .result();
}
于 2011-12-13T15:10:15.777 に答える
0
public int compareTo(Object o){
  int res = field.compareTo(o.field);
  if(res==0)
    res=field1.compareTo(o.field1);
  return res;
}

動作するはずです

于 2011-12-13T15:14:13.420 に答える
0

できますよ。ただし、比較のルールを定義する必要があります。

例えば

あなたが持っている

objectA{a=1;b=2;c=3}
objectB{a=20;b=1;c=6}

あなたの方法では、とcompareTo(Object o)比較できます。本当に必要かどうかを比較することもできます。ポイントは、objectA < objectB の場合のルールを定義する必要があることです。等..this.fieldso.fieldsthis.ao.c

于 2011-12-13T15:14:32.750 に答える
0

もちろん。比較的簡潔な方法を次に示します。

public int compareTo(MyClass other) {
    return
        a!=other.a ? Integer.compare(a, other.a) :
        b!=other.b ? Integer.compare(b, other.b) :
                     Integer.compare(c, other.c);
}

( Integer.compareJava SE 7 のものですが、実装は難しくありません。intフィールドab、を想定cしていますが、比較できるフィールド タイプは基本的に同じです。)

于 2011-12-13T15:14:39.660 に答える
0

比較するときに他のフィールドを考慮に入れることは確かにできますが、通常、アルファベット順にソートすると、最初の文字が同じ場合に 2 番目の文字のみが表示されるように、優先順位があります。

public int compareTo(Object o){

   int comparison = field.compareTo(o.field);
   if (comparison != 0)
      return comparison;
   comparison = field2.compareTo(o.field2);
   if (comparison != 0)
      return comparison;
   //etc...
}
于 2011-12-13T15:11:52.737 に答える
-1

次のいずれかの方法で実行できます。

public int compareTo(Object o)
{    
    return (field.compareTo(o.field)==1 && field2.compareTo(o.field2)==0)? 0 : 1; 
} 

また

public int compareTo(Object o)
{
    // add various if-else blocks
    // OR
    // call a separate method    
}
于 2011-12-13T15:12:16.767 に答える