我正在使用集合,我无法弄清楚...我想基于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);
}
}
答案 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
个对象进行比较。
旁注:您的班级成员应该是私人的。你甚至有吸气剂,为什么他们公开?