【发布时间】:2011-10-25 06:33:24
【问题描述】:
我有这段代码应该将SortedLinkedList 的两个实例合并到一个 SLL 中(基于 mergeSort 合并),但它返回的是一个空列表:
import java.util.LinkedList;
public class SortedLinkedList<T extends Comparable<? super T>>
extends LinkedList<T> {
private LinkedList<T> list; // the sorted list
// constructor, sorted with insertion sort
public SortedLinkedList(LinkedList<T> in)
{
if(in.peek() == null || in.size() == 1)
return;
else {
list = new LinkedList<T>();
for(T e : in)
list.add(e);
int i, j;
T temp;
for(i = 0; i < list.size(); i++){
j = i;
temp = list.get(j);
while(j > 0 && list.get(j-1).compareTo(temp) > 0){
list.set(j, list.get(j-1));
j--;
}
list.set(j, temp);
}
}
}
// return the union of the sorted linked lists this
// and other
public SortedLinkedList<T> makeUnion( SortedLinkedList<T> other)
{
list = new LinkedList<T>();
SortedLinkedList<T> temp = new SortedLinkedList<T>(list);
int i = 0, j = 0;
while(i < this.size() && j < other.size()){
if(this.get(i).compareTo(other.get(j)) <= 0){
temp.add(this.get(i));
i++;
}
else {
temp.add(other.get(j));
j++;
}
}
while(i < this.size()){
temp.add(this.get(i));
i++;
}
while(j < other.size()){
temp.add(other.get(j));
j++;
}
return temp;
}
// print the items in list
public void print()
{
for(T e : list)
System.out.println(e);
}
}
在 SLL 构造函数中,我让它简单地返回 null 列表(私有变量列表在此方法的第一行初始化)。但是据我所知,这仍然应该给我一个 SLL 对象(最初也是null)。我可以在方法本身中很好地添加 temp,但在打印列表时会得到一个 NullPointerException。
我意识到将 get 与 LinkedList 一起使用并不是很有效。解决这个问题后,我将使用迭代器切换它们。
任何提示将不胜感激。
编辑:有趣的是,如果我将两个列表都放在临时 LL 中,然后在其上使用构造函数,我会得到相同的结果。由于 SLL 扩展了 LL,因此这些类型是兼容的:
public SortedLinkedList<T> makeUnion( SortedLinkedList<T> other)
{
LinkedList<T> temp = new LinkedList<T>();
temp.addAll(this);
temp.addAll(other);
SortedLinkedList<T> merge = new SortedLinkedList(temp);
return merge;
}
EDIT2:似乎@Mead 是正确的......虽然 size() 和 get() 似乎适用于 SLL,但 add() 却没有。我在想,既然我正在扩展 LinkedList,它也可以与 SLL 一起使用。它没有,并且覆盖它们也没有做任何事情......我对此没有想法。有什么建议吗?
【问题讨论】:
-
与其提供一些代码并描述其余部分,不如提供一个简短但完整的程序来说明问题。非常不清楚您为什么要在
makeUnion方法中分配给list实例变量...我希望不理会现有列表。您的循环逻辑也有些问题 - 我希望您希望while循环在for循环之后,但您需要在循环中检查您是否已经用尽 @987654332 @也... -
这有一些问题(例如,这不是合并排序的正确实现)。您需要有测试代码证明 add()、get() 和 size() 工作正常。然后通过调用传递 LinkedList 的 SortedLinkedList 构造函数来测试实例化(如上面的代码中所示) - 并且在实例化之后 add()、get()、size() 仍然有效。以您的实例变量“链接”所暗示的方式,我怀疑它们是否正常工作 - 看来您正在扩展 Java List 类之一,但也使用私有实例变量“列表”。
-
嘿。我的精神力量告诉我答案可能是用
LinkedList<T> list = new LinkedList<T>();替换list = new LinkedList<T>();,但实际上,展示整个程序会有所帮助 - 任何答案都是猜测我们看不到的代码。 -
很抱歉。感谢 Jon 提出这个问题,我现在修复了合并并处理了这些案例。 @Mead我不想让你们看着一团糟,这就是为什么我认为我只能摆脱那个sn-p。变量列表在顶部声明,我很抱歉。问题是 makeUnion 方法应该返回一个类构造函数类型的对象,所以我确定我声明 temp 的那一行是我出错的地方......
-
只是为了烦人,让排序列表扩展 List 接口在概念上是错误的,因为您不能遵守 List 协定 - 也就是说,元素保持插入顺序。这就是为什么java中没有SortedList接口,而有SortedSet。
标签: java exception merge linked-list