链表的通用类型实现和交换两个通用对象

时间:2015-05-07 02:14:06

标签: java generics interface comparable

实现Comparable的通用类

我的第一个问题是如何正确实现实现compareTo的Generic类。我目前的课程定义是:

public static class Node<T> implements Comparable<Node<T>>{

我的compareTo方法是:

public <T extends Comparable<T>> int compareTo(Node<T> n){

1a上。这些定义是否正确?

1b中。我应该如何完成compareTo方法?我在网上找到的大部分文献都引用了方法本身使用的.compareTo(),这对我来说没有意义。

在链接列表中交换两个节点:

我当前的方法定义是

public void swap(Node<T> n1, Node<T> n2){
    // swap
}
  1. 是否可以在单链表实现中交换两个节点,或者交换方法本身是否需要链接列表的双向链接实现?

2 个答案:

答案 0 :(得分:3)

  

1a上。这些定义是否正确?

不完全。您对compareTo的定义是声明一个类型变量,这可能是错误的:

public <T extends Comparable<T>> int compareTo(Node<T> n){

(它实际上不应该编译。)

应该是:

@Override
public int compareTo(Node<T> n){
  

1b中。我该如何完成compareTo方法?

这取决于你应该比较的东西。既然你没有说明,我们不知道。 ; )

  

我在网上找到的大部分文献都引用了方法本身使用的.compareTo(),这对我来说没有意义。

以下是一个如何使用它的示例:

// saying T must also be Comparable:
// it's possible you are supposed to do
// this for your own Node declaration too
//         vvvvvvvvvvvvvvvvvvvvvvv
class Node<T extends Comparable<T>> implements Comparable<Node<T>> {
    T data;

    @Override
    public int compareTo(Node<T> that) {
        return this.data.compareTo( that.data );
    }
}

现在我们可以比较节点,但它实际上委托给任何数据。我们不知道或不关心数据是什么(尽管它不能为空),只是它实现了Comparable

  

2。是否可以在单链表实现中交换两个节点,或者交换方法本身是否需要链接列表的双向链接实现?

这里的提示是你不需要交换节点,只需要交换数据。

答案 1 :(得分:0)

  

我目前的班级定义是:

public static class Node<T> implements Comparable<Node<T>>{
  

我的compareTo方法是:

public <T extends Comparable<T>> int compareTo(Node<T> n){
  

1a上。这些定义是否正确?

类声明看起来很好。与compareTo()方法不同。通过在方法(<T extends Comparable<T>>)上指定类型参数,您声明了一个泛型方法,这种方法与普通方法不同,后者恰好依赖于类型参数。你想要这个,而不是:

public int compareTo(Node<T> n){
  

1b中。我应该如何完成compareTo方法?我在网上找到的大部分文献都引用了方法本身使用的.compareTo(),这对我来说没有意义。

您可以根据Node类的字段以任何有意义的方式实现该方法。如果您不清楚什么会使Node小于另一个Comparable,那么该课程可能不应该实施.compareTo()

您对compareTo()使用的困惑在问题本身中很明显。 compareTo()作为特定类上下文之外的方法名称没有意义。有许多这样的方法,都各不相同。在许多情况下,在实现不同类的compareTo()方法时,使用一个类的jQuery(document).ready(function($) { $("#insert-media-button").on('click', function() { setTimeout(function() { $('#media-attachment-filters').val('unattached'); }, 0); }); }); 方法是明智的。

  
      
  1. 是否可以在单链表实现中交换两个节点,或者交换方法本身是否需要链接列表的双向链接实现?
  2.   

可以在单链表中交换节点。您可能只能交换有效负载,但如果必须交换节点对象本身,那么您需要遍历列表以查找每个节点的前一节点。根据数据结构的详细信息,当要交换的其中一个节点是列表中的第一个节点时,可能需要特殊处理。