переопределить абстрактный метод compare () - PullRequest
2 голосов
/ 30 апреля 2011

Привет, я довольно новичок в программировании, и у меня возникают трудности с моим методом сравнения, у меня есть несколько классов, моя первоначальная проблема связана с моим родительским классом.

Я получаю эту ошибку:

Person не является абстрактным и не переопределяет сравнение методов (java.lang.Object, java.lang.Object) в Comparator

    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.

Напишите класс ComparePlayers, который реализует интерфейс Comparator <Player>. Он должен сравнивать игроков по количеству сыгранных игр (а затем по алфавиту в порядке фамилии, если количество сыгранных игр одинаково). Реализуйте новый конструктор для класса Club, который принимает параметр Comparator <Player>. Поэтому напишите основную программу, которая будет печатать информацию о каждом игроке в клубе, где игроки перечислены в порядке убывания сыгранных игр. Это должно позволить порядку диктоваться основной программой без изменения кода в любом из ваших других классов.

Извините, если это долго, но я изо всех сил пытаюсь понять, что не так, я попробовал несколько вариантов, и это просто не сработало. это должно произойти в пятницу, и мы будем очень признательны за толчок в правильном направлении.

Ответы [ 4 ]

5 голосов
/ 30 апреля 2011

Измените реализацию сравнения на:

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

}
4 голосов
/ 30 апреля 2011

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 должна вызывать 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);
    }
    ...
  }
}
1 голос
/ 30 апреля 2011

Метод сравнения Comparator принимает два параметра Object, в то время как ваш метод принимает два параметра Person, поэтому компилятор не может найти, где вы переопределяете этот метод. Решение состоит в том, чтобы либо изменить параметры метода на Object, либо использовать (и предпочтительно) общий компаратор, поскольку это позволит вашему методу сравнения иметь параметры Person, а также добавить проверку безопасности типов во время компиляции.

edit 1: стрелять, у вас уже есть пример универсального класса Comparable.

edit 2: Я не видел, чтобы вы создавали свой собственный интерфейс, пока я не прочитал комментарий об этом. Я согласен с комментатором - используйте класс уже в java.util.

0 голосов
/ 30 апреля 2011

Как исключение предполагает это объявление

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...