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

Java 使用泛型和集合实现compareTo(),java,sorting,collections,comparable,generic-collections,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;

我在做收藏工作,我想不出这个。。。我想基于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类节点实现可比较{
公共电子数据;
公共节点下一步;
公共节点(){
数据=空;
next=null;
}
公共节点(E数据1){
数据=数据1;
}
公共E getData(){
返回数据;
}
公共节点getNext(){
下一步返回;
}
@凌驾
公共内部比较(E/o){
//TODO自动生成的方法存根
返回0;
}
}

公共类测试{
公共静态void main(字符串参数[]){
ArrayList arr=新的ArrayList();
节点n1=新节点(1);
节点n2=新节点(3);
节点n3=新节点(4);
节点n4=新节点(3);
节点n5=新节点(6);
节点n6=新节点(2);
arr.add(n1);
arr.add(n2);
arr.add(n3);
arr.add(n4);
arr.add(n5);
arr.add(n6);
集合。排序(arr);
}
}

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

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

如果您的
节点
类接受
null
数据元素,则必须更仔细地实现
compareTo()

您的声明在我看来很奇怪。例如,将
节点
整数
进行比较会很奇怪-通过比较其中的整数,将
节点
与另一个
节点
进行比较会更有意义

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

所以我想:

public class Node<E extends Comparable<E>> implements Comparable<Node<E>> {
    ...
    public int compareTo(Node<E> node) {
        return data.compareTo(node.data);
    }
}
public类节点实现可比较{
...
公共整数比较(节点){
返回data.compareTo(node.data);
}
}
您可以以牺牲复杂性为代价使其更加灵活,如下所示:

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

public class 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);
    }

}
类节点实现可比较的{
私人电子数据;
@凌驾
公共整数比较(节点arg0){
返回arg0.data.compareTo(数据);
}
}
还请注意,您应该将
Node
对象与
Node
对象进行比较,而不是将
Node
对象与
E
对象进行比较

旁注:你的班级成员应该是私人的。你甚至有能手,那为什么他们是公开的呢

public class Node<E extends Comparable<? super E>> implements Comparable<Node<E>>
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);
    }

}