实现可比较的界面

时间:2011-05-17 22:20:35

标签: java compare comparable

我刚刚发现这个考试题目,但无法弄清楚:

下面描述了一个实现Comparable接口的设计部分类。这个设法类的唯一目的是将它的实例与给定的字符串进行比较。

我们需要在课堂上填写两件事来完成它。这是班级:

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 个答案:

答案 0 :(得分:5)

首先,第1部分应该是:

public class PrivateComparableClass implements Comparable<PrivateComparableClass> {

至于第2部分,如果thing是班级中唯一的数据成员,您可以简单地搭载String.compareTo

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

我建议您阅读compareTo is meant to work的方式(有三种可能的结果:小于,等于和大于)。

答案 1 :(得分:2)

扩大一点:

比较器函数通常采用两个参数(让我们称之为A和B)并遵循返回的约定

  • -1,如果A&lt;乙
  • 0如果A == B
  • 1,如果A&gt;乙

另外,如果使用实例变量,则不应将compareTo声明为“static”。

答案 2 :(得分: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,则应该为每个方法添加合适的空值检查行为。

答案 3 :(得分:0)

嗯,这或多或少是如何声明和实现类的

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

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