【发布时间】:2012-08-07 23:24:06
【问题描述】:
[已解决]
我是一名 C++ 人员,正在为(希望)即将到来的工作学习 Java。因此,我正在自己练习在 Java 中实现链接列表。我完成了一个标准的双向链表,它工作得很好。然而,我随后尝试创建一个有序链表,并意识到无法重载 '
我在这个网站上查看了其他人的问题,但我仍然没有得到解决,所以我想我会发布我的代码并获得更适合我正在做的事情的答案。
以后..
链表类:
public class MyList<T> {
/*** ~Public Interface~ ***/
//insert, delete, size, print, etc.
...
/*** Private Data Members ***/
//node begin, end, T data
....
/** Private node class **/
//Represents the nodes in the list
private class node implements Comparable<T>{ //Don't know if this is right
node next;
node prev;
T data;
node(node p, node n, T d){
next = n;
prev = p;
data = d;
}
@Override
public int compareTo(T o) {
return (data <= o ? 1 : 0); //Get an error still here
}
/** Iterator **/
//iterator class
}
有序链表类:
public class OrderedList<T> extends MyList<T> implements Comparable<T>{ //Pretty sure this is wrong
public void insert(T d){
if(empty()){
push_front(d);
} else {
MyList<T>.MyListIter it = begin();
int i = 0;
//This won't work obviously
for(; i < size() || it.current().compareTo(it.next()) == -1; ++i, it.next()){
//find node to place the new node before it
it.prev() //Need to go back one since we went forward in the loopcheck.
}
}
}
这里真的很茫然。如何实现类似于运算符重载的东西,以便我可以完成这个有序列表的实现?
我也在尝试掌握 Java 中的继承,所以如果您发现这方面有问题,也请随时提出意见。
谢谢大家。
更新:
好的,我进行了我认为必须进行的更改,但我仍然遇到错误。这是新代码:
MyList 类中的节点类:
private static class node<T> implements Comparable<T>{
node<T> next;
node<T> prev;
T data;
node(node<T> p, node<T> n, T d){
next = n;
prev = p;
data = d;
}
public int compareTo(T o) {
return ((Comparable<T>) this.data).compareTo(o);
}
}
有序列表:
公共类 OrderedList> 扩展 MyList{
compareTo 的用法:
if(((Comparable<T>) it).compareTo(it.next()) == -1) found = true;
编译器强迫我做这些转换,现在错误是:
MyList$MyListIter cannot be cast to java.lang.Comparable
列表迭代器类如下:
public class MyListIter{
它在 MyList 中。
编辑[已解决]
当我使用我的迭代器时,我没有使用 it.current() 来访问实际数据,而是使用 it.compareTo(..),但我的迭代器当然不是数据,因此不是对 compareTo() 有所了解。
【问题讨论】:
-
你从不声明类型参数
T;不过,您真正想要的是实现Comparable<node<T>>。由于您希望您的元素也是Comparable,因此您可能应该指定例如OrderedList<T extends Comparable<T>>;你不需要让OrderedList实现Comparable本身。 -
另外,应该是
Node<T>,而不是node。 -
您的一些代码被 HTML 破坏了,因为它前面有两个空格(在“有序列表:”标题下)。另外,您遇到了什么错误?
标签: java inheritance linked-list operator-overloading