覆盖抽象方法compare()

时间:2011-04-30 12:15:06

标签: java comparator

嗨,我对编程很陌生,而且我的比较方法有问题,我有几个课程,我最初的问题是我的父课。

我收到此错误:

Person不是抽象的,并且不会覆盖比较器中的方法比较(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 <Player>团队中。

我的界面:

    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 <Player>接口的ComparePlayers类。它应该根据所玩游戏的数量来比较玩家(如果玩的游戏数量相同,则按字母顺序排列)。为Club类实现一个带有Comparator <Player>参数的新构造函数。因此,编写一个主程序,打印关于俱乐部中每个玩家的信息,其中玩家按照游戏的降序排列。这应该允许主程序指定排序而不修改任何其他类中的代码。

我很抱歉,如果这是漫长的啰嗦,但我很难看出有什么问题,我已经尝试了几种变化而且它不会工作。这是在星期五,只是推动正确的方向将非常感激。

4 个答案:

答案 0 :(得分:5)

将比较实施更改为:

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());

}

答案 1 :(得分:4)

PersonPlayer不应实施Comparator。如果需要通过某种自然顺序进行比较,则应实施Comparable

你的ComparePlayers课程看起来很好,它有什么问题? (我假设你在这里使用java.util.Comparator,不是吗?)

为了对列表进行排序,您可以使用Collections.sort(players, new ComparePlayers());,如果players的类型为List<Player>(相应的是该接口的实现)。

请注意,如果PersonPlayer应该Comparable,那么您需要实现compareTo(Person p2)compareTo(Player p2),其中Player的实现应该调用{ {1}}对于平等比赛的情况。

示例:

super.compareTo(p2);

答案 2 :(得分:1)

Comparator的compare方法接受两个Object参数,而您的方法接受两个Person参数,因此编译器无法找到您重写此方法的位置。解决方案是将方法的参数更改为Objects,否则(并且最好)使用通用的Comparator,因为这将允许您的compare方法具有Person参数,并且还在编译时添加类型安全检查。

编辑1:拍摄,你已经有了一个通用的可比较类的例子。

编辑2:我没有看到你创建自己的界面,直到我阅读了关于此的评论。我同意评论者的意见 - 使用java.util中的类。

答案 3 :(得分:0)

就像异常暗示这个声明一样

  • 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());

}