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

时间:2014-03-21 14:54:57

标签: java generics comparable

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


实施双向链表类。

方法:

  • 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),因为我不知道该怎么做。

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

有人可以帮忙,请非常重要吗?

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

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


代码:

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. 我们是否已使用extendimplement s Comparable<E>或其他内容!

  2. 我应该对方法insertToHead(Comparable)

  3. 进行哪些更改
  4. 我应该对main进行哪些更改。

1 个答案:

答案 0 :(得分:3)

您可能希望了解generics的工作原理。基本的想法是你想要设置你的类,以便它不会确切地知道对象的特定类型,但可以给出一些暗示它可以期望的声明泛型类型的东西。

在您的情况下,您希望设置列表,以便您可以创建可以比较的任何内容的链接列表。 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>()

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

    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 method比较对象,这可能对排序提示提示有用。

    该doc页面为如何使用此方法提供了非常好的解释。您应该注意,在他们的文档中,他们使用名为T的通用类型而不是E,它实际上并没有什么区别,只要它是您的程序所特有的,您可以随意调用它。

    修改

    排序方向的每个提示:

    扩展Comparable类的Ojbects有一个名为compareTo的方法,这个方法被设置为你可以调用:

    object1.compareTo(object2);
    

    此方法返回int,它将是:

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

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

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

    NodeA.data.compareTo(NodeB.data)
    

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

    可能会在<=班级>=方法中找到==IntegercompareTo运算符。

    类似的东西:

    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
    }
    

    有关详细信息,请参阅Docs on Integer