【问题标题】:Implementing the comparable interface实现可比较的接口
【发布时间】:2011-05-17 22:20:35
【问题描述】:

我刚找到这个考试题,想不通:

下面描述了一个人为的部分类,它实现了 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;
  }
}

我将如何解决这个问题?

【问题讨论】:

    标签: java compare comparable


    【解决方案1】:

    首先,第 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 的原理(有三种可能的结果:小于、等于和大于)。

    【讨论】:

    • 我认为不应该是static :)
    • @Messa:很好,谢谢!我的复制和粘贴错误。现已修复。
    【解决方案2】:

    稍微扩展一下:

    比较器函数通常接受两个参数(我们称它们为 A 和 B)并遵循返回的约定

    • -1 如果 A
    • 0 如果 A == B
    • 1 如果 A > B

    此外,如果您使用实例变量,compareTo 不应声明为“静态”。

    【讨论】:

      【解决方案3】:

      首先,Comparable 接口是通用的;你的声明应该指定一个类型参数:

      public class PrivateComparableClass 
        implements Comparable<PrivateComparableClass> {
      

      然后,您应该在compareTo() 方法(这是一个实例方法,而不是类成员)中比较该类的thing 成员。

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

      行为良好的Comparable 应该实现与其compareTo() 方法一致的equals() 方法:

      @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,则应在每个方法中添加适当的空值检查行为。

      【讨论】:

      • 在你的 equals 覆盖你的最后一行应该是: return compareTo((PrivateComparableClass) obj) == 0;
      【解决方案4】:

      嗯,这或多或少应该是声明和实现类的方式

      public class PrivateComparableClass implements Comparable<PrivateComparableClass>
      {
          private String thing;
          //... other stuff
      
          public int compareTo(PrivateComparableClass o)
          {
             return this.thing.compareTo(o.thing);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多