列表按照它们应该的方式排序,但是当我试图在我的makeUnion中将两个列表合并在一起时,它打印出列表为空。谁能帮我,告诉我为什么?在主要当我尝试SortedLinkedList合并= 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());
}
}
}
SortedLinkedList<T> UnionList = null;
如果UnionList
是null
,则不能调用UnionList.add()
。在添加内容之前,您需要分配一个新列表。
实际上,我认为您最初的问题可能是SortedLinkedList
既扩展 LinkedList
,又包含LinkedList
的实例。你应该选择其中之一,而不是两者都选。您的代码有时访问一个列表,有时访问另一个列表,因此一个列表显示为空,因为您已向另一个列表添加了项。
在开始使用UnionList之前不需要初始化它。
SortedLinkedList<T> UnionList = null;
应该读
SortedLinkedList<T> UnionList = new SortedLinkedList<T>();
作为奖励,listtiterator应该是listtiterator
因为您使用了继承而不是委托。继承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.