列表按照它们应该的方式排序,但是当我尝试在makeUnion中将两个列表合并在一起时,它打印出列表为空。任何人都可以帮助我,告诉我为什么?在main中,当我尝试SortedLinkedList merge = sortedNames1.makeUnion(sortedNames2)时,我得到“空列表”。
public class SortedLinkedList<T extends Comparable<? super T>>
extends LinkedList<T>
{
private LinkedList<T> list; //the sorted list
//the constructor
public SortedLinkedList(LinkedList<T> in)
{
if(in.isEmpty())
{
System.out.println("Empty list");
}
if(in.size() < 2)
{
return;
}
else
{
list = new LinkedList<T>();
for(int i = 1; i < in.size(); i++)
{
T temp = in.get(i);
int j = i;
while(j > 0 && in.get(j - 1).compareTo(temp) > 0)
{
in.set(j, in.get(j-1));
j--;
}
in.set(j, temp);
}
for(T elements : in)
{
list.add(elements);
}
}
}
//return the union of the sorted linked lists this and other
public SortedLinkedList<T> makeUnion( SortedLinkedList<T> other)
{
SortedLinkedList<T> first = new SortedLinkedList<T>(other);
SortedLinkedList<T> second = new SortedLinkedList<T>(list);
SortedLinkedList<T> UnionList = null;
int i = 0;
int j = 0;
while(i<first.size() && j<second.size())
{
if(first.get(i).compareTo(second.get(j)) <= 0)
{
UnionList.add(first.get(i));
i++;
}
else
{
UnionList.add(second.get(j));
j++;
}
}
if(i == first.size())
{
for(int k = j; k<second.size(); k++)
{
UnionList.add(second.get(k));
}
}
else if(j == second.size())
{
for(int x = i; x<first.size(); x++)
{
UnionList.add(first.get(x));
}
}
return UnionList;
}
//print the items int list
public void print()
{
ListIterator itr = list.listIterator();
while(itr.hasNext())
{
System.out.println(itr.next());
}
}
}
答案 0 :(得分:1)
SortedLinkedList<T> UnionList = null;
如果UnionList.add()
为UnionList
,则无法致电null
。在添加内容之前,您需要先分配一个新列表。
实际上,我认为您原来的问题可能是SortedLinkedList
扩展 LinkedList
并且还包含{{1}的实例 }。你应该选择其中一个,但不能两个。您的代码有时会访问一个列表,有时会访问另一个列表,因此一个列表显示为空,因为您已将项目添加到其他列表中。
答案 1 :(得分:0)
在开始使用UnionList之前,不要初始化它。
SortedLinkedList<T> UnionList = null;
应该阅读
SortedLinkedList<T> UnionList = new SortedLinkedList<T>();
作为奖励,ListIterator应该是ListIterator&lt; T&gt;所以使用了正确的toString()方法。实际上,你将调用Object.toString()。
答案 2 :(得分:0)
因为您使用了继承而不是委托。您继承了LinkedList,您唯一要做的就是定义一个构造函数,该构造函数以适当的顺序将未排序列表的内容添加到新列表中。但是你没有覆盖size
方法,所以这个方法是从LinkedList继承的,它不关心你的内部排序列表,因此总是返回0。
在大多数情况下,扩展收藏是个坏主意。在这种情况下,这是一个特别糟糕的主意,因为不可能有一个尊重LinkedList API的排序LinkedList。假设您的列表包含A,B和C,并在其上调用addFirst("Z")
。你会把Z放在哪里,如果在开头,你的列表就不再排序了。如果最后,您不尊重addFirst
的合同。
只需使用链接列表(而不是扩展它们),然后对它们进行排序。你可以这么做:
LinkedList list = new LinkedList(someUnsortedList);
Collections.sort(list); // now the list is sorted
list.addAll(someOtherList);
Collections.sort(list); // now both lists are merged, and the resulting list is sorted.