【问题标题】:override abstract method compare()覆盖抽象方法 compare()
【发布时间】:2011-04-30 12:15:05
【问题描述】:

您好,我是编程新手,比较方法有困难,我有几个类,我最初的问题是我的父类。

我收到此错误:

Person 不是抽象的,不会覆盖 Comparator 中的方法 compare(java.lang.Object, java.lang.Object)

    public class Person implements Comparator
    {
     //some methods

    public int compare(Person p1, Person p2)
    {
       // if last names are the same compare first names
       if(p1.getLastName().equals(p2.getLastName()))
       {
           return p1.getFirstName().compareTo(p2.getFirstName());
       }
       return p1.getLastName().compareTo(p2.getLastName());

    }

我的子类看起来像这样:

    public class Player extends Person implements Comparator
    {
      //some methods

    public int compare(Player p1, Player p2)
    {
       if(p1.getGamesPlayed()<p2.getGamesPlayed())

       {
          return -1;
       }else if (p1.getGamesPlayed()==p2.getGamesPlayed())
       {
          return 0;
       }else
       {
          return 1;
       }
     }

我还有一个俱乐部类,它将所有信息存储在 ArrayList&lt;Player&gt;team 中。

我的界面:

    public interface Comparator<T>
    {
        int compare(T o1, T o2);
    }

我也有这门课

   public class ComparePlayers implements Comparator<Player>
   {

      public int compare(Player p1, Player p2)
      {
         if(p1.getGamesPlayed()< p2.getGamesPlayed())
         {
            return -1;
         }else if(p1.getGamesPlayed()== p2.getGamesPlayed())
         {
            return p1.getLastName().compareTo(p2.getLastName());
         }else
         {
             return 1;
         }
       }

这个规范是:

当一个新球员签约时,她/他应该按姓氏的字母顺序(如果姓氏相同,则按名字的字母顺序)插入俱乐部类。为此,请让您的 Person 和 Player 类实现适当的 Comparable 接口。

编写一个实现 Comparator&lt;Player&gt; 接口的 ComparePlayers 类。它应该按玩过的游戏数比较玩家(如果玩过的游戏数相同,则按姓氏的字母顺序)。为接受 Comparator&lt;Player&gt; 参数的 Club 类实现一个新的构造函数。因此编写一个主程序,该程序将打印俱乐部中每个球员的信息,其中球员按比赛的降序排列。这应该允许主程序指定排序,而无需修改任何其他类中的代码。

很抱歉,如果这是冗长的,但我正在努力找出问题所在,我尝试了几种变体,但它不起作用。这将在周五发布,只要朝着正确的方向前进,我们将不胜感激。

【问题讨论】:

  • 与其编写自己的 Comparator 接口,不如使用 java.util 包中的接口。

标签: java comparator


【解决方案1】:

将您的比较实现更改为:

public int compare(Object o1, Object 02)
{
   Person p1 = (Person)o1;
   Person p2 = (Person)o2;
   // if last names are the same compare first names
   if(p1.getLastName().equals(p2.getLastName()))
   {
       return p1.getFirstName().compareTo(p2.getFirstName());
   }
   return p1.getLastName().compareTo(p2.getLastName());

}

【讨论】:

  • 谢谢你,我总是想念眼前的东西 :)
  • 不同意:最好使用泛型进行编译时类型检查,因为 OP 已经在使用他的 Comparator
  • @Hovercraft:我认为其他答案涵盖了该选项。我的只是解决问题中特定错误的一种方法:)
  • @Cjb1982:知道了,对错误的假设表示抱歉。但更重要的是,您了解我们关于泛型使用的讨论以及泛型的重要性吗?
  • @Hovercraft:别担心 :)。是的,我得到了通用的东西。感谢您的帮助
【解决方案2】:

PersonPlayer 不应实现 Comparator。如果它们需要通过某种自然顺序进行比较,您应该实现Comparable

您的ComparePlayers 类看起来不错,有什么问题? (我假设你在这里使用java.util.Comparator,不是吗?)

如果players 的类型为List&lt;Player&gt;(分别是该接口的实现),您可以使用Collections.sort(players, new ComparePlayers()); 对列表进行排序。

请注意,如果 PersonPlayer 应该是 Comparable,那么您需要实现 compareTo(Person p2)compareTo(Player p2),其中 Player 的实现应该调用 super.compareTo(p2); 来处理相同的游戏情况。

例子:

class Person<T extends Person> implements Comparable<T> {
  public int compareTo(Tp2) { ... }
}

class Player extends Person<Player> {
  public int compareTo(Player p2) {
    ...
    if(gamesPlayed == p2.getGamesPlayed() ) {
      return super.compareTo(p2);
    }
    ...
  }
}

【讨论】:

  • 这给了我一个编译错误。 Comparable 不能被不同的参数继承:
【解决方案3】:

Comparator 的 compare 方法采用两个 Object 参数,而您的方法采用两个 Person 参数,因此编译器无法找到您在何处覆盖此方法。解决方案是将方法的参数更改为 Objects,或者(最好)使用泛型 Comparator,因为这将允许您的 compare 方法具有 Person 参数,并在编译时添加类型安全检查。

编辑 1:拍摄,您已经有了一个通用 Comparable 类的示例。

编辑 2:我没有看到您正在创建自己的界面,直到我阅读了有关此的评论。我同意评论者的观点——使用 java.util 中已有的类。

【讨论】:

    【解决方案4】:

    就像这个例外表明这个声明一样

    • public int compare(Person p1, Person p2)

    必须改为

    • public int compare(Object p1, Object p2)

    那你还得把方法代码调整为

    public int compare(Object p1, Object p2)
    {
       // if last names are the same compare first names
       if(((Person)p1).getLastName().equals(((Person)p2).getLastName()))
       {
           return ((Person)p1).getFirstName().compareTo(((Person)p2).getFirstName());
       }
       return ((Person)p1).getLastName().compareTo(((Person)p2).getLastName());
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 2014-03-18
      • 2016-01-02
      相关资源
      最近更新 更多