2013-08-04 59 views
0

我對此很新,很抱歉,如果這是一個古怪的問題。我有一個ArrayList,其中Node是一個自定義類。這就是我定義它:如何排序對象的ArrayList?

static class Node implements Comparable<Node> { 
    String nodeName; 
    String[] borderingNodes; 

    public Node(String nodeName, String[] borderingNodes) { 
     this.nodeName = nodeName; 
     this.borderingNodes = borderingNodes; 
    }  

    public int compareTo(Node node) { 
     if(borderingNodes.length > node.borderingNodes.length) { 
      return 1;   
     } 

     if(borderingNodes.length == node.borderingNodes.length) { 
      return 0;   
     } 

     if(borderingNodes.length < node.borderingNodes.length) { 
      return -1;   
     } 
    } 
} 

現在,我試圖做一個Arrays.sort(inputNodes)其中inputNodes是一個ArrayList ......不過,我得到了錯誤:

no suitable method found for sort(ArrayList<Node>) 
     Arrays.sort(inputNodes); 

如何正確地做到這一點?我排序btw ...必須排序的邊界節點陣列的大小。

+1

如果數組的集合擴展邊界則不能進行排序。 –

回答

5

使用Collections.sort(inputNodes)

Arrays.sort旨在用於排序陣列

您當前的compareTo方法不會爲每個代碼路徑返回一個整數。您可以使用Integer.compare

public int compareTo(Node node) { 
    return Integer.compare(borderingNodes.length, node.borderingNodes.length); 
} 
3

您正在使用爲數組設計的函數對List進行排序。

您可以改爲使用Collections.sort(List)。它的意思是List s。

2

您可以使用Collections.sort()(它有一個可選的比較,如果這就是利息)。

請注意,這將對您的收藏進行排序(即修改原件),因此您可能希望進行復制。

還請注意ordering tutorial,這是值得一讀。

0

您可以實施compareTo方法進行自定義比較。 How to override compareTo:

public int compareTo(Node o) 
{ 
    //return should be based on the fields in the class 

} 

然後只是去像

Collections.sort(yourList); 

實現自定義比較的另一個好辦法就是喜歡這個職位here

Collections.sort(nodeList, new Comparator<Node>(){ 
    public int compare(Node o1, Node o2){ 
     if(o1.nodeName.compareTo(o2.nodeName) == 0) 
      //implement custom compare based on another field 
     return o1.nodeName.compareTo(o2.nodeName); 
    } 
}); 
0
  1. 可以使用Collections.sort(節點)到節點任何集合的一個子類,即一個ArrayList的元素進行排序。

  2. 節點類不能是靜態的,因爲您想比較類節點的不同對象。

  3. @Override應該在compareTo(Node other)方法 之前添加,因爲它覆蓋了在接口中聲明的方法。

  4. 類變量應該是公開的並且可以直接訪問,或者可以是私有的並且通過方法訪問。

  5. compareTo(Node other)方法中的比較可以簡化。

生成的代碼會是這樣的:

class Node implements Comparable<Node> { 
    private String nodeName; 
    private String[] borderingNodes; 

    public Node(String nodeName, String[] borderingNodes) { 
     this.nodeName = nodeName; 
     this.borderingNodes = borderingNodes; 
    }  

    public int getBorderingNodesLength() { 
     return borderingNodes.length; 
    } 

    @Override 
    public int compareTo(Node otherNode) { 
     return Integer.compare(borderingNodes.length, otherNode.getBorderingNodesLength()); 
    } 
}