使用泛型制作链接列表

时间:2010-04-06 13:28:04

标签: java generics data-structures linked-list

我目前正在努力完成一项姗姗来迟的任务。 我应该使用泛型制作一个链表。或者,我有一个名为Creature的接口,该列表应该排序。但是怎么样?当界面无法生成Creature nextCreature指针时,列表如何对生物进行排序?我知道要使用普通对象创建一个链表,但这个通用的东西让我感到难过。

这只是这项任务的一小部分,但由于这一点,我无处可去。

4 个答案:

答案 0 :(得分:3)

通用链表类通常使用通用辅助类来实现,以表示列表的节点。此Node类将包含T类型的元素(其中T是泛型参数)和对下一个节点(类型Node<T>)的引用。所以它看起来像这样:

class Node<T> {
    T element;
    Node<T> next;
};

如果是双向链表,该节点还将包含对前一节点的引用。使用此Node类,您应该能够很好地定义链接列表实现(列表将只包含对第一个节点的引用(以及双链接列表的最后一个节点),然后通过操作来定义列表操作节点)。

答案 1 :(得分:3)

您的问题是您不得不考虑链表中的每个对象都必须指向下一个(可能是之前的)对象。这不太对。您需要做的是构建一个只包含其他对象的对象链接列表。因此,不要试图找出如何修改Creature以使其具有指针,而只需创建一个通用ListEntry对象的链接列表,每个对象都有对其他ListEntrys的引用,并且可以保留一些待指定的(通用的) )输入T.从外面看,每个生物都会像其他人一样引用,但从内部你会知道每个生物只是由一个ListEntry对象携带。这是他们谈论封装时的意思之一。

顺便说一句,这是在Java Collections框架中完成的。

答案 2 :(得分:1)

只要您实施Comparable,就会自动处理排序:

class Creature implements Comparable {
    public int compareTo(Object o) {
        return 0; // TODO: Your compare function here.
    }
}

class Ape extends Creature {}
class Elephant extends Creature {}

然后,您可以创建一个通用列表并对其进行排序:

public static void main(String[] args) {
    LinkedList<Creature> creatures = new LinkedList<Creature>();
    Collections.addAll(creatures, new Elephant(), new Ape());
    Collections.sort(creatures);
}

答案 3 :(得分:0)

public interface Creature {
    public void doSomething();
}

public class MyCreature implements Creature {
    public void doSomething() { }
}

你可以在你的代码中使用它:

List<Creature> genericList = new LinkedList<Creature>();
genericList.add(new MyCreature());
Creature c = genericList.get(0);