为什么我得到一个空列表,当我试图合并两个排序Linkedlists



列表按照它们应该的方式排序,但是当我试图在我的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;

如果UnionListnull,则不能调用UnionList.add()。在添加内容之前,您需要分配一个新列表。

实际上,我认为您最初的问题可能是SortedLinkedList扩展 LinkedList,又包含LinkedList实例。你应该选择其中之一,而不是两者都选。您的代码有时访问一个列表,有时访问另一个列表,因此一个列表显示为空,因为您已向另一个列表添加了项。

在开始使用UnionList之前不需要初始化它。

SortedLinkedList<T> UnionList = null;

应该读

SortedLinkedList<T> UnionList = new SortedLinkedList<T>();

作为奖励,listtiterator应该是listtiterator 以便使用正确的toString()方法。实际上,您将调用Object.toString()。

因为您使用了继承而不是委托。继承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.

相关内容

  • 没有找到相关文章

最新更新