如何对对象的ArrayList进行排序?

时间:2013-08-04 13:50:47

标签: java sorting arraylist comparator compareto

我对此很新,很抱歉,如果这是一个陈腐的问题。我有一个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),其中inputNodes是一个ArrayList ...但是我得到了错误:

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

我该如何正确地做到这一点?我的排序btw ...必须按照boundingNodes数组的大小排序。

5 个答案:

答案 0 :(得分:5)

使用Collections.sort(inputNodes)

Arrays.sort用于排序数组

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

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

答案 1 :(得分:3)

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

您可以改用Collections.sort(List)。它适用于List s。

答案 2 :(得分:2)

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

请注意,这会对您的收藏品进行排序(即修改原件),因此您可能需要复印一份。

另请注意ordering tutorial,这非常值得一读。

答案 3 :(得分: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);
     }
});

答案 4 :(得分:0)

  1. 您可以使用Collections.sort(节点)对 nodes 是任何集合的子类(即ArrayList)的元素进行排序。

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

  3. @Override应该在compareTo(Node other)方法之前添加 因为它会覆盖接口中声明的方法。

  4. 类变量应该是公共的并且可以直接访问 私有的,通过一种方法访问。

  5. compareTo(Node other)方法的比较可以简化。

  6. 结果代码如下:

    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());
        }
    }