2013-08-04 57 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()); 
    } 
}