因此,对于我的类,我必须编写自己的链表。我基本上理解,但老师写了mynode类
public class MyNode<E extends Comparable<E>> {
E element;
MyNode<E> next;
public MyNode(E item) {
element = item;
next = null;
}
}
我们打算制作一个类来运行它,并让它运行这个程序
public class TestLinkedList {
public static void main(String[] args) {
MyLinkedList<String> L = new MyLinkedList<String>();
L.add("Browns");
L.add("Ravens");
L.add("Steelers");
L.add("Bengals");
L.add("Chargers");
System.out.println(L);
System.out.println(L.find("Ravens") ? "Found Ravens" : "Did not find Ravens");
System.out.println(L.find("Giants") ? "Found Giants"
: "Did not find Giants");
L.insertElementBefore("Steelers", "Colts");
L.delete("Chargers");
System.out.println("Result after deleting Chargers: " + L);
}
}
但我不明白为什么节点的扩展具有可比性。我发现了很多节点只是节点E的例子,但没有一个像这样,我只是被如何使用它来编写我的链表所困扰。
首先:Node不是扩展Comparable,Node类的类型E
是扩展Comparaable。
泛型绑定<E extends Comparable<E>>
是一个"自引用"绑定,意味着类型E
实现了Comparable<E>
接口,该接口具有方法int compareTo(E e)
。
处理Comparable对象的通常原因是为了对它们进行排序——用java的话说,它们有一个自然排序顺序。
您的任务是实现在MyLinkedList类上调用的各种方法。如果从示例代码中调用的方法是唯一的方法,那么MyNode
的泛型类型就没有理由需要是Comparable
,即MyNode<E>
就可以了。
Comparable的理念是使节点易于比较。在技术层面上,它强加了一个总顺序:不相等对象有一个明确的顺序(小于或等于是强加总顺序的运算符的一个例子)。正如nEm在评论中指出的那样,Java不知道一个对象"小于"另一个对象意味着什么,这与整数不同;这就是compareTo
(Comparable接口公开的方法)的作用。
如果不知道链表实现的完整接口,就不可能说出它在哪里有用。一些有根据的猜测包括Node.insertElementBefore
函数或Node.find
(如果需要实现的话)。