3

この試験問題を見つけたのですが、理解できません :

以下は、 Comparable インターフェースを実装する不自然な部分クラスを示しています。この考案されたクラスの唯一の目的は、そのインスタンスを特定の文字列と比較することです。

クラスを終了するには、クラスで記入する必要があるものが 2 つあります。クラスは次のとおりです。

public class PrivateComparableClass // FILL IN PART 1 { 
   private String thing;

    public PrivateComparableClass(String thing) {
     this.thing=thing;
    }
   //FILL IN PART 2
}

パート1は単に次のものに対応すると想定しています:

public class PrivateComparableClass implements Comparable {

パート 2 では、彼は compareTo メソッドの実装を期待していると思いますが、これを適切に実装する方法がよくわかりません。

public static int compareTo() {
  if this.thing.equals(thing){
  return 1;
  } else {
    return -1;
  }
}

これを修正するにはどうすればよいですか?

4

4 に答える 4

5

まず、パート 1 は次のようになります。

public class PrivateComparableClass implements Comparable<PrivateComparableClass> {

パート 2 に関してthingは、 がクラス内の唯一のデータ メンバーである場合は、次のように簡単にピギーバックできますString.compareTo

public int compareTo(PrivateComparableClass rhs) {
  return this.thing.compareTo(rhs.thing);
}

compareToがどのように機能するのかをよく読んでおくことをお勧めします(3 つの可能な結果があります: より小さい、等しい、より大きい)。

于 2011-05-17T22:23:28.397 に答える
2

少し拡張するには:

コンパレータ関数は通常、2つの引数(AとBと呼びましょう)を取り、戻る規則に従います。

  • -1(A <Bの場合)
  • A==Bの場合は0
  • A>Bの場合は1

また、インスタンス変数を使用している場合は、compareToを「静的」と宣言しないでください。

于 2011-05-17T22:31:00.993 に答える
2

まず、Comparableインターフェースは汎用的です。宣言では型パラメーターを指定する必要があります。

public class PrivateComparableClass 
  implements Comparable<PrivateComparableClass> {

thing次に、メソッド内のクラスのメンバーを比較する必要compareTo()があります (これはインスタンス メソッドであり、クラス メンバーではありません)。

@Override
public final int compareTo(PrivateComparableClass that) {
  return this.thing.compareTo(that.thing);
}

行儀の良い人は、そのメソッドと一貫性のあるメソッドをComparable実装する必要があります。equals()compareTo()

@Override
public final boolean equals(Object obj) {
  if (obj == this)
    return true;
  if (!(obj instanceof PrivateComparableClass))
    return false;
  return compareTo((PrivateComparableClass) obj) == 0;
}

また、 をオーバーライドする場合は、オーバーライドequals()する必要もありますhashCode()

@Override
public final int hashCode() {
  return thing.hashCode();
}

thingが本当に許可されている場合はnull、適切な null チェック動作を各メソッドに追加する必要があります。

于 2011-05-17T22:33:36.220 に答える
0

まあ、これは多かれ少なかれクラスが宣言され実装されるべき方法です

public class PrivateComparableClass implements Comparable<PrivateComparableClass>
{
    private String thing;
    //... other stuff

    public int compareTo(PrivateComparableClass o)
    {
       return this.thing.compareTo(o.thing);
    }
}
于 2011-05-17T22:29:54.020 に答える