2010-05-15 211 views
1

你好,所以我有這個任務,我需要實現接口來查看一個ArrayList並對其進行排序(升序或降序)。我不想要「的」答案我只需要一些建議,我的方法,爲什麼我得到這個錯誤實現接口

Exception in thread "main" java.lang.ClassCastException: Week7.Check cannot be cast to java.lang.Comparable 
at java.util.Arrays.mergeSort(Unknown Source) 
at java.util.Arrays.sort(Unknown Source) 
at java.util.Collections.sort(Unknown Source) 
at Week7.TestCheck.main(TestCheck.java:18) 

這是我做的:

媲美了一個方法叫public int compairTo(Object o)

public class Check implements comparable { 
    private Integer checkNumber; 

    public Check(Integer newCheckNumber) { 
     setCheckNumber(newCheckNumber); 
    } 

    public String toString() { 
     return getCheckNumber().toString(); 
    } 

    public void setCheckNumber(Integer checkNumber) { 
     this.checkNumber = checkNumber; 
    } 

    public Integer getCheckNumber() { 
     return checkNumber; 
    } 

    @Override 
    public int compairTo(Object o) { 
     Check compair = (Check) o; 
     int result = 0; 
     if (this.getCheckNumber() > compair.getCheckNumber()) 
      result = 1; 

     else if (this.getCheckNumber() < compair.getCheckNumber()) 
      result = -1; 

     return result; 
    } 
} 
在我的主

我有這個

import java.util.ArrayList; 
import java.util.Collections; 

public class TestCheck { 
    public static void main(String[] args) { 
     ArrayList checkList = new ArrayList(); 

     checkList.add(new Check(445)); 
     checkList.add(new Check(101)); 
     checkList.add(new Check(110)); 
     checkList.add(new Check(553)); 
     checkList.add(new Check(123)); 

     Collections.sort(checkList); 

     for (int i = 0; i < checkList.size(); i++) { 
      System.out.println(checkList.get(i)); 
     } 
    } 
} 
+0

我猜你的意思是標籤的Java而不是JavaScript,因此我重新標記它。 – 2010-05-15 18:37:13

+0

請記得把你的代碼放在一個代碼塊 – Galen 2010-05-15 18:38:06

+0

我不確定它是否只是複製錯誤,但我認爲它應該是可比較的不可比較的 – 2010-05-15 18:44:55

回答

1

要使用Comparator(您使用兩個參數調用),必須將其作爲參數傳遞給Collections.sort方法。

像這樣:

Collections.sort(checkList, new Comparator<Check>() { 
    public int compare(Check one, Check two) { 
     return one.getCheckNumber() - two.getCheckNumber(); 
    } 
}); 

這是它會是什麼樣子:

import java.util.List; 
import java.util.ArrayList; 
import java.util.Comparator; 
import java.util.Collections; 

public class Check { 
    private final Integer checkNumber; 

    public Check(Integer newCheckNumber) { 
     this.checkNumber = newCheckNumber; 
    } 
    public Integer getCheckNumber() { 
     return this.checkNumber; 
    } 
    public static void main(String [] args) { 
     List<Check> list = new ArrayList<Check>(); 

     list.add(new Check(445)); 
     list.add(new Check(101)); 
     list.add(new Check(110)); 
     list.add(new Check(553)); 
     list.add(new Check(123)); 

     Collections.sort(list, new Comparator<Check>() { 
      public int compare(Check one, Check two){ 
       return one.getCheckNumber() - two.getCheckNumber(); 
      } 
     }); 
     for(Check item : list) { 
      System.out.println(item.getCheckNumber()); 
     } 
    } 
} 
0

當你實現你必須使用所提供的接口方法簽名的接口,正是因爲它在接口中定義:

public int compareTo(Object o) 

而且你可能想參數列表如。 List<Comparable>,以及比較例如。 Comparable<Check>因爲使用泛型是一種編譯時技術,它會識別您的拼寫錯誤

+0

好吧我如何做,如果我要使用比較器2參數呢? – user319570 2010-05-16 05:46:09

7

來吧 - Java是區分大小寫的。 「可比」與「可比」不一樣

public class Check implements comparable 

拼寫也很重要。 「compairTo」是不一樣的方法「的compareTo」

@Override 
public int compairTo(Object o) { 
+0

是的你是正確的我發現我的錯誤非常感謝你和即時通訊對不起標籤^^: – user319570 2010-05-15 18:53:14

+0

我想念拼寫它...唯一的問題是它沒有說明爲什麼在一個明確的方式。 – user319570 2010-05-15 18:54:29

+1

@ 1ace1如果是解決問題的人,您應該點擊此答案上的複選標記。 – 2010-05-15 19:30:21

0

無論你傳遞給Arrays.sort()必須實現Comparable,這是一個java系統接口。你可能想扔掉comparable

0

[...並且]爲什麼我得到這個錯誤

當你撥打:

Collections.sort(checkList); 

在第18行,該方法需要你的元素實現Comparable(以便能夠比較它們)您可能不知道這一點,但它是如何工作的(如documentation中所述)

列表中的所有元素都必須實現Comparable接口

然後,該方法運行時,它試圖以「鑄造」你的對象類型Comparable因爲你的類沒有實現它,它拋出ClassCastException

爲了更好地理解這一點,試試下面的代碼:

class Some { 
} 
class Test { 
    public static void main(String [] args) { 
     Runnable r = (Runnable) new Some(); 
    } 
} 

如果你分析行你可能認爲「你爲什麼試圖從一些分配一個Runnable?他們不相關!「

你是對的,讓我們來看看輸出:

$ java Test 
Exception in thread "main" java.lang.ClassCastException: Some cannot be cast to java.lang.Runnable 
     at Test.main(A.java:5) 

相同的錯誤信息,您可以看看第5行,看到劇組

這正是它的發生。在Collections.sort的方法,但Comparable

+0

好吧我如何做到這一點,如果即時通訊將使用2個參數的比較器? – user319570 2010-05-16 06:27:12

+0

@ 1ace1沒有duffymo回答你的問題? – OscarRyz 2010-05-16 15:50:11

+0

@ 1ace1我添加了一個新答案:http://stackoverflow.com/questions/2841284/implementing-interface/2844404#2844404 – OscarRyz 2010-05-16 16:00:43

2

我猜接口你實現可比不是接口java.lang.Comparable,它們的名字可能相同,但是包?