首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写抽象方法compare()

重写抽象方法compare()
EN

Stack Overflow用户
提问于 2011-04-30 20:15:06
回答 4查看 47.7K关注 0票数 3

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

我得到了这个错误:

Person不是抽象的,并且不覆盖比较器中的方法compare(java.lang.Object,java.lang.Object

代码语言:javascript
复制
    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());

    }

我的子类看起来像这样:

代码语言:javascript
复制
    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>团队中。

我的界面:

代码语言:javascript
复制
    public interface Comparator<T>
    {
        int compare(T o1, T o2);
    }

我也有这门课

代码语言:javascript
复制
   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类实现适当的可比较接口。

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

我很抱歉,如果这是长篇大论,但我正在努力找出问题所在,我已经尝试了几个变体,但它就是不起作用。这将在周五到期,只要朝着正确的方向推进,我们将非常感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-30 20:23:14

将您的比较实现更改为:

代码语言:javascript
复制
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());

}
票数 7
EN

Stack Overflow用户

发布于 2011-04-30 20:25:12

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

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

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

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

示例:

代码语言:javascript
复制
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);
    }
    ...
  }
}
票数 4
EN

Stack Overflow用户

发布于 2011-04-30 20:21:09

compare的compare方法接受两个对象参数,而你的方法接受两个Person参数,因此编译器找不到你在哪里覆盖了这个方法。解决方案是要么将方法的参数更改为对象,要么(最好)使用通用比较器,因为这将允许compare方法具有Person参数,并在编译时添加类型安全检查。

编辑1:拍摄,您已经有了一个泛型可比较类的示例。

编辑2:直到我读到关于这个的评论,我才发现你在创建你自己的界面。我同意评论者的观点--使用java.util中已经存在的类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5841665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档