嗨,我对编程很陌生,而且我的比较方法有问题,我有几个课程,我最初的问题是我的父课。
我收到此错误:
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>
参数的新构造函数。因此,编写一个主程序,打印关于俱乐部中每个玩家的信息,其中玩家按照游戏的降序排列。这应该允许主程序指定排序而不修改任何其他类中的代码。
我很抱歉,如果这是漫长的啰嗦,但我很难看出有什么问题,我已经尝试了几种变化而且它不会工作。这是在星期五,只是推动正确的方向将非常感激。
答案 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)
Person
和Player
不应实施Comparator
。如果需要通过某种自然顺序进行比较,则应实施Comparable
。
你的ComparePlayers
课程看起来很好,它有什么问题? (我假设你在这里使用java.util.Comparator
,不是吗?)
为了对列表进行排序,您可以使用Collections.sort(players, new ComparePlayers());
,如果players
的类型为List<Player>
(相应的是该接口的实现)。
请注意,如果Person
和Player
应该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());
}