【问题标题】:implementing compareTo() with generics and collection用泛型和集合实现 compareTo()
【发布时间】:2012-08-27 09:15:25
【问题描述】:

我正在使用集合,但我无法弄清楚...我想根据 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);  
    }
}

【问题讨论】:

    标签: java sorting collections comparable generic-collections


    【解决方案1】:

    你的声明在我看来很奇怪。例如,比较 Node&lt;Integer&gt; 和 Integer 会很奇怪 - 通过比较其中的整数来比较 Node&lt;Integer&gt; 和另一个 Node&lt;Integer&gt; 会更有意义。

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

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

    【讨论】:

      【解决方案2】:

      您所做的基本上是将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 对象进行比较。

      旁注:您的班级成员应该是私人的。你甚至还有 getter,那为什么要公开呢?

      【讨论】:

        【解决方案3】:

        基本上,您的集合的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()。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-25
          • 1970-01-01
          • 2018-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多