使用泛型和集合实现compareTo()

时间:2012-09-02 07:42:31

标签: java sorting collections comparable generic-collections

我正在使用集合,我无法弄清楚...我想基于Node类中的“data”变量覆盖compareTO()方法..这样我就可以调用collection.sort()来排序的ArrayList ..

public class Node<E> implements Comparable<E>{

    public E data;
    public Node<E> next;

    public Node(){
        data=null;
        next=null;
    }

    public Node(E data1){
        data=data1;
    }

    public E getData(){
        return data;        
    }

    public Node<E> getNext(){
        return next;        
    }

    @Override
    public int compareTo(E o) {
        // TODO Auto-generated method stub
        return 0;
    }
}

public class Test { 
    public static void main(String args[]){
        ArrayList<Node> arr= new ArrayList<Node>();
        Node n1=new Node(1);
        Node n2=new Node(3);
        Node n3=new Node(4);
        Node n4=new Node(3);
        Node n5=new Node(6);
        Node n6=new Node(2);
        arr.add(n1);
        arr.add(n2);
        arr.add(n3);
        arr.add(n4);
        arr.add(n5);
        arr.add(n6);

        Collections.sort(arr);  
    }
}

3 个答案:

答案 0 :(得分:3)

你的声明对我来说很奇怪。例如,将Node<Integer>Integer进行比较会很奇怪 - 将Node<Integer>与另一个Node<Integer>进行比较会比较其中的整数更有意义。< / p>

然后,您需要约束E,以便比较两个数据值。

所以我怀疑:

public class Node<E extends Comparable<E>> implements Comparable<Node<E>> {
    ...
    public int compareTo(Node<E> node) {
        return data.compareTo(node.data);
    }
}

您可以以复杂性为代价,使其更加灵活,例如:

public class Node<E extends Comparable<? super E>> implements Comparable<Node<E>>

(代码的主体将保持不变......)

答案 1 :(得分:0)

基本上,您的集合中的E元素也必须具有可比性,可以通过以下方式强制执行:

public class Node<E extends Comparable<E> implements Comparable<Node<E>> {

现在在compareTo()中,您只需比较您的元素:

@Override
public int compareTo(Node o) {
    return data.compareTo(o.data);
}

如果您的Node班级接受null数据元素,则必须更加谨慎地实施compareTo()

答案 2 :(得分:0)

您所做的基本上是将Node的比较委托给运行时类型E的比较,因此E本身也应该实现Comparable。所以我认为你的意思是:

class Node<E extends Comparable<E>> implements Comparable<Node<E>> {

    private E data;

    @Override
    public int compareTo(Node<E> arg0) {        
        return arg0.data.compareTo(data);
    }

}

另请注意,您应该将Node个对象与Node个对象进行比较,而不是将Node个对象与E个对象进行比较。

旁注:您的班级成员应该是私人的。你甚至有吸气剂,为什么他们公开?