繁体   English   中英

如何在类中使用Comparable作为通用参数

[英]How to use Comparable as a Generic parameter in a Class

我在数据结构课程中有家庭作业,问题是:


实现双向链表类。

方法:

  • display()

  • length()size()

  • insertSorted(Comparable)

  • insertToEnd(Comparable)

  • insertToHead(Comparable)

  • delete(Comparable)

  • boolean search(Comparable)

你必须在JAVA中这样做

创建一个应用程序层来测试您的类及其方法。 将所有源文件压缩到一个文件中,并将其重命名为CS214HW1_first_lastName.zip将您的名字放在文件名中。 如果需要,请添加ReadMe.txt文件以获取编译等额外信息。


我正确地实现了一切,代码工作正常,但我用例如: insertSorted(int)而不是insertSorted(Comparable) ,因为我不知道该怎么做。

我在线搜索,并阅读JAVA文档( Comparable ),但这还不够:(

请问有人帮忙,请问这很重要吗?

这是我的一些代码,我不能写出来,因为我不希望我的朋友得到相同的代码。

如果有相同的代码我会取零。


码:

class DLL {    
    class Node {
        Node next;
        Node prev;
        int data;

        Node() {
            next = null;
            prev = null;
            data = 0;
        }

        Node(int dt) {
            next = null;
            prev = null;
            data = dt;
        }
    }

    Node head;

    void insertToHead(int dt) {    
        if (head == null) {    
            head = new Node(dt);    
        }    
        else {
            head.prev = new Node(dt);
            head.prev.next = head;
            head = head.prev;
        }
    }

    public static void main(String args[]) {    
        DLL dll = new DLL();

        dll.insertToHead(1);
        dll.insertToHead(2);
        dll.insertToHead(3);
    }
}

请有人告诉我在class开始时要改变什么。

  1. 我们是不是使用extend s或implement s Comparable<E>或者什么!

  2. 我应该做什么改变方法insertToHead(Comparable)

  3. 我应该对main做些什么改变。

您可能希望了解泛型如何工作。 基本的想法是,您希望设置您的类,以便它不会确切地知道对象的特定类型,但可以给出它可以期望的声明泛型类型的事物类型的一些提示。

在您的情况下,您希望设置列表,以便您可以创建可以比较的任何内容的链接列表。 Java有一个class ,你提到它叫做Comparable<E> ,它告诉Java它能够在提供的对象上调用compareTo等方法。

更具体地说,你的结束问题:

  1. 使用以下类声明类型MyClass<MyGenericType extends Comparable<MyGenericType>> 在你的情况下, DLL<E extends Comparable<E>>

  2. 切换方法参数接受E我们所宣布的泛型类型。

  3. 您应该使用class Integer而不是基本类型int ,并将列表的创建更改为DLL<Integer> dll = new DLL<Integer>()

提供的代码的完全更新版本:

public class DLL<E extends Comparable<E>> {
    class Node {
        Node next;
        Node prev;
        E data;

        Node() {
            next = null;
            prev = null;
            data = null;
        }

        Node(E dt) {
            next = null;
            prev = null;
            data = dt;
        }
    }

    Node head;

    void insertToHead(E dt) {
        if (head == null) {    
            head = new Node(dt);
        }    
        else {
            head.prev = new Node(dt);
            head.prev.next = head;
            head = head.prev;
        }
    }

    public static void main(String args[]) {    
        DLL<Integer> dll = new DLL<Integer>();

        dll.insertToHead(1);
        dll.insertToHead(2);
        dll.insertToHead(3);
    }
}

这个新的实现应该提供如何继续执行其他一些功课任务的提示。 例如,您现在可以通过compareTo方法比较对象,这可能对排序提示提示有用。

该doc页面为如何使用此方法提供了非常好的解释。 你应该注意到,在他们的文档中,他们使用一个名为T而不是E的泛型类型,它确实没有任何区别你可以随意调用它,前提是它对你的程序是唯一的。

编辑:

排序方向的每个提示:

扩展Comparable类的Ojbects有一个叫做compareTo的方法,这个方法设置成你可以调用:

object1.compareTo(object2);

这个方法返回一个int ,它将是:

  • 当object1大于object2时> 0
  • 当object1等于object2时= 0
  • 当object1小于object2时< 0

我不想放弃太多,因为这是一项家庭作业,但这是我的提示:

通过以上代码设置类的方式,您可以通过调用以下方式告诉NodeANodeB之间的关系:

NodeA.data.compareTo(NodeB.data)

这将返回一个整数,根据上面的列表提供您的信息。

<=>===运算符很可能在Integer类的compareTo方法中找到。

就像是:

public int compareTo(Object o) {
    int otherNumber = ((Integer) o).intValue();
    int thisNumber = this.intValue();
    if (otherNumber > thisNumber) {
        return 1;
    } else if (otherNumber < thisNumber) {
        return -1;
    } else {
        return 0;
    }
}

但他们更有可能只做以下事情:

public int compareTo(Object o) {
    return this.intValue() - o.intValue(); // possibly normalized to 1, -1, 0
}

有关详细信息,请参阅Integer文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM