3

我正在使用集合,但我无法弄清楚......我想基于 Node 类中的“数据”变量覆盖 compareTO() 方法......这样我就可以调用 collection.sort() 来对数组列表进行排序......

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

3 回答 3

3

你的声明在我看来很奇怪。Node<Integer>例如,将 a与 an进行比较会很奇怪-通过比较其中的整数来将 a与另一个进行比较Integer会更有意义。Node<Integer>Node<Integer>

然后,您需要进行约束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>>

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

于 2012-09-02T07:48:48.447 回答
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对象进行比较。

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

于 2012-09-02T07:49:10.633 回答
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()则必须更仔细地实现。

于 2012-09-02T07:48:11.700 回答