почему я получаю пустой список, когда пытаюсь объединить два отсортированных связанных списка?

#java #linked-list

#java #связанный список

Вопрос:

Списки сортируются так, как они должны, но когда я пытаюсь объединить два списка вместе в моем makeUnion, он выводит пустой список. кто-нибудь может мне помочь и рассказать, почему? в основном, когда я пытаюсь 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 amp;amp; 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() amp;amp; 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());
            }
        }
    }
  

Ответ №1:

         SortedLinkedList<T> UnionList = null;
  

Вы не можете вызвать UnionList.add() if UnionList is null . Вам нужно будет выделить новый список, прежде чем вы сможете добавлять в него что-либо.

На самом деле, я думаю, что ваша первоначальная проблема может заключаться в том, что SortedLinkedList оба расширяются LinkedList , а также содержат экземпляр a LinkedList . Вы должны выбрать один или другой, но не оба. Ваш код иногда обращается к одному списку, а иногда к другому, поэтому один список кажется пустым, потому что вы добавили элементы в другой список.

Комментарии:

1. спасибо за помощь, это работает :). вы правильно поняли, что первоначальная проблема была с моими sortedlinkedlist и unionlist. Я починил его, и теперь он работает.

Ответ №2:

Вы не инициализируете UnionList перед началом его использования.

 SortedLinkedList<T> UnionList = null;
  

следует прочитать

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

В качестве бонуса ListIterator должен быть ListIterator<T>, чтобы использовался правильный метод toString() . Как бы то ни было, вы будете вызывать Object.toString() .

Комментарии:

1. SortedLinkedList<T> UnionList = новый SortedLinkedList<T>();

2. Я пробовал это, но он говорит мне, что не может быть применен к заданным типам required LinkList<T>

Ответ №3:

Потому что вы использовали наследование вместо делегирования. Вы наследуете LinkedList, и единственное, что вы делаете, это определяете конструктор, который добавляет содержимое несортированного списка в новый в соответствующем порядке. Но вы не переопределяете size метод, поэтому этот метод наследуется от LinkedList , который не заботится о вашем внутреннем отсортированном списке и, следовательно, всегда возвращает 0.

Расширение коллекции в большинстве случаев является плохой идеей. В данном случае это особенно плохая идея, потому что невозможно иметь отсортированный LinkedList, который уважает LinkedList API. Предположим, ваш список содержит 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.
  

Комментарии:

1. мы должны написать наш собственный метод и не использовать Collections.sort

2. Тогда просто используйте MyOwnUtilityClass.sort(list) вместо Collections.sort(list) (и, почему бы и нет, MyOwnUtilityClass.mergeSortedLists(list1, list2))