2011-04-30 64 views
1

嗨我編程合理新,我有比較方法的困難,我有幾個類,我的最初問題是與我的父類。重寫抽象方法比較()

我得到這個錯誤:

人不是抽象的,不重寫方法比較比較(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接口。

編寫一個實現比較器<Player>接口的類ComparePlayers。它應該通過玩遊戲的次數比較玩家(如果玩的遊戲數量相同,則按姓氏的字母順序)。爲Club類使用Comparator <Player>參數實現一個新的構造函數。因此,編寫一個主要程序,通過降低玩遊戲的順序,打印關於列出玩家的俱樂部中每個玩家的信息。這應該允許命令由主程序決定,而不用修改任何其他類中的代碼。

對不起,如果這是很長的囉嗦,但我很努力地看到什麼是錯的,我已經嘗試了幾個變化,它只是不會工作。這是因爲在週五,只是在正確的方向推動將非常感激。

+3

而不是寫自己比較接口,使用一個在java.util包中。 – karakuricoder 2011-04-30 12:22:34

回答

4

你比較實現更改爲:

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

} 
+0

謝謝,我總是懷念我面前的東西:) – Cjb1982 2011-04-30 12:32:14

+3

不同意:最好使用泛型進行編譯時類型檢查,因爲OP已經在使用他的比較器。 – 2011-04-30 12:32:28

+0

@Hovercraft:我同意 – 2011-04-30 14:42:31

1

比較器的比較方法需要兩個Object參數,而您的方法需要兩個Person參數,因此編譯器無法找到您重寫此方法的位置。解決方法是將方法的參數更改爲Object或其他(並且最好)使用泛型Comparator,因爲這將允許您的比較方法具有Person參數,並且還會在編譯時添加類型安全檢查。

編輯1:拍攝,你已經有了一個通用的Comparable類的例子。

編輯2:我沒有看到你正在創建自己的界面,直到我閱讀關於此的評論。我同意評論者 - 使用java.util中的類。

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

} 
4

PersonPlayer不應該實現Comparator。如果他們需要通過某種自然順序進行比較,則應該執行Comparable

您的ComparePlayers類看起來很好,它有什麼問題? (我假設你使用的java.util.Comparator這裏,不是嗎?)

爲了排序您可以使用Collections.sort(players, new ComparePlayers());列表,如果players類型爲List<Player>的(相應地,該接口的實現)。

注意,如果PersonPlayer應該Comparable,那麼你需要實現compareTo(Person p2)compareTo(Player p2)其中對於玩家的實現應該調用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); 
    } 
    ... 
    } 
} 
+0

這給我一個編譯錯誤。可比較的不能用不同的參數繼承: Cjb1982 2011-04-30 12:55:13

+0

哦,是的,你是對的,修復這個例子。 – Thomas 2011-04-30 21:00:45

相關問題