0

我对此很陌生,如果这是一个老生常谈的问题,我很抱歉。我有一个 ArrayList ,其中 Node 是一个自定义类。这就是我定义它的方式:

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)where inputNodes is an ArrayList ...但是我得到了错误:

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

我该如何正确地做到这一点?顺便说一句,我的排序...必须对borderingNodes数组的大小进行排序。

4

5 回答 5

5

利用Collections.sort(inputNodes)

Arrays.sort用于排序数组

您当前的compareTo方法不会为每个代码路径返回一个整数。您可以使用Integer.compare

public int compareTo(Node node) {
   return Integer.compare(borderingNodes.length, node.borderingNodes.length);
}
于 2013-08-04T13:53:18.093 回答
3

您正在尝试List使用为数组设计的函数对 a 进行排序。

你可以Collections.sort(List)改用。它是为Lists 设计的。

于 2013-08-04T13:53:09.543 回答
2

您可以使用Collections.sort()(如果感兴趣,它需要一个可选的比较器)。

请注意,这将对您的收藏进行适当的排序(即修改原件),因此您可能希望获取一份副本。

另请注意订购教程,非常值得一读。

于 2013-08-04T13:53:23.343 回答
0

您可以实现 compareTo 方法来进行自定义比较。 如何覆盖 compareTo:

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

}

然后就像

Collections.sort(yourList);

实现自定义比较器的另一种好方法是这里的这篇文章。

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);
     }
});
于 2013-08-04T13:57:41.373 回答
0
  1. 您可以使用 Collections.sort(nodes) 对元素进行排序,其中节点是任何集合的子类,即 ArrayList。

  2. 节点类不能是静态的,因为您想比较 Node 类的不同对象。

  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());
    }
}
于 2013-08-04T14:16:10.850 回答