2015-11-28 34 views
1

我正在學習Java並想對包含對象的數組進行排序。要做到這一點,我想使用Comparable。我一直遇到一個編譯錯誤,似乎指出我沒有實現compareTo(我做過)或者比較器有問題(我現在不想使用它)。我在下面列出的一個小程序中隔離了這個問題。任何幫助非常感謝,因爲我花了幾個小時在網上搜索。Comparable接口如何工作?

我已經註釋掉了一些main的代碼,因爲我真正想要做的是創建一個帶有接口對象的數組並使用Comparable進行排序。我不確定這是否可行,所以我現在正在測試排序類。

package comp_test;

import java.util.ArrayList; 
    import java.util.List; 

    public class program { 

    public static void main(String[] args) 
    { 
     List<root> container = new ArrayList<root>(); 

     container.add (new A ("Een")); 
    //  container.add (new AA ("twee")); 
     container.add (new B ("drie")); 
    //  container.add (new AA ("vier")); 
     container.add (new A ("en Vijf")); 

     for (root r: container) 
     { 
      r.show(); 
     } // for 
     List.sort (container); // <=== error 
     // The method sort(Comparator) in the type List is not 
     // applicable for the arguments (List<root> 
    } 

    /* 
    public static void main(String[] args) 

    { 
     List<Itf> container = new ArrayList<Itf>(); 

     container.add (new A ("Een")); 
     container.add (new AA ("twee")); 
     container.add (new B ("drie")); 
     container.add (new AA ("vier")); 
     container.add (new A ("en Vijf")); 

     for (Itf i: container) 
     { 
      i.show(); 
     } // for 
     container.sort(); 
    } 
    */ 
    } 

    -------------- 
    package comp_test; 

    public interface Itf 
    { 
    public void show(); 
    } 
    --------------- 
    package comp_test; 

    abstract public class root implements Itf, Comparable<root> 
    { 
    abstract public void show(); 
    abstract public String getID(); 

    @Override 
    public int compareTo (root other) 
    { 
     return this.getID().compareTo (other.getID()); 
    } /*** compareTo ***/ 

    } 
    ------------------ 
    package comp_test; 

    public class A extends root 
    { 
    private String ID; 

    public A (String id) 
    { 
     this.ID = id; 
    } /*** A ***/ 

    public String getID() 
    { 
     return ID; 
    } /*** getID ***/ 

    @Override 
    public void show() 
    { 
     System.out.println ("A (" + getID() + "): " + super.toString()); 
    } /*** show ***/ 

    } 
    ------------------ 
    package comp_test; 

    public class B extends root 
    { 
    private String Name; 

    public B (String id) 
    { 
     this.Name = id; 
    } /*** B ***/ 

    @Override 
    public String getID() 
    { 
     return Name; 
    } /*** getID ***/ 

    @Override 
    public void show() 
    { 
     System.out.println ("B (" + Name + "): " + super.toString()); 
    } /*** show ***/ 

    } 
+0

請將您的代碼編輯爲演示問題的最小*示例(因此沒有評論代碼),並確保您指定了正確的錯誤。 –

+0

您想改爲使用'Collections.sort(container)'。 –

+1

請考慮遵循格式化代碼的一些約定。例如首字母大寫的類名,函數名和第一個paren之間沒有空格。 – bhspencer

回答

2

您試圖調用s ORT是這樣的:

List.sort(container); 

當你得到這樣一個編譯器錯誤,你應該看看Javadoc中導致錯誤的方法。查看List.sort的Javadoc,我們可以看到該方法不是靜態的,但是您正在嘗試使用它,就好像它一樣。由於該方法也不是一成不變的,需要調用它,你正試圖排序的對象:

container.sort(null); 

進一步閱讀有關該方法的,Javadoc中說,如果你想使用的包含對象的自然順序(即他們的compareTo方法),那麼你應該傳遞null,而不是比較器(正如我上面所做的那樣)。

順便說一句,你也可以打電話Collections.sort(container);但這只是一個包裝,它所要做的就是致電container.sort(null)

+0

謝謝! container.sort(null)起作用。 Collection.sort(容器)不。並且非常感謝您的闡述:-) – Arnold

+0

您拼錯集合(注意複數形式):-) –

1

,而不是

List.sort (container);

你應該使用

Collections.sort (container); 

container.sort(new Comparator<root>() { 
     @Override 
     public int compare(root o1, root o2) { 
      return o1.compareTo(o2); 
     } 
    }); 

或(使用lambda):

container.sort((o1, o2) -> o1.compareTo(o2)); 

或(使用lambda,案例2):

container.sort(root::compareTo); 
+0

爲什麼包含創建冗餘比較器的其他選項? –

+0

@Viacheslav,Collection.sort(container);不編譯。錯誤:類型集合的方法排序(列表)未定義。 – Arnold

+0

不使用「Collection.sort」,而使用「Collections.sort」(末尾帶「S」) –

1

你應該使用這樣的:

container.sort() 

它會使用你的根元素填充列表的compareTo方法

PS:root - > Root(對象命名開始將大寫字母)