2017-12-21 29 views
0

returnなしでこのmergeSort()メソッドを実装しようとしていますが、変数を呼び出したメソッドに格納することができません。たとえば、最初のhead:{3,2}のmergeSort(head)を呼び出すと、メソッドは{2,3}を出力します。実際にはリストが実際にソートされていますが、mergeSort()を呼び出すメソッドではheadは{3,2}のままです。呼び出し側のクラスの変数も更新できる方法はありますか?Java - 呼び出し元クラスのメソッド変数を変更するにはどうすればよいですか?

アルゴリズム自体に関するコメントも高く評価されますが、コメントのセクションにそれらを保管してください。

@Test 
    public void testMergesortUnsortedList() { 
     List<Integer> sequence = new ArrayList<>(Arrays.asList(3, 2, 1, 5, 4)); 
     MergeSort.mergeSort(sequence); 
     System.out.println("final: " + sequence); 
     assertEquals(Arrays.asList(1, 2, 3, 4, 5), sequence); 

     sequence = new ArrayList<>(Arrays.asList(3, 2, 1, 6, 5, 4)); 
     MergeSort.mergeSort(sequence); 
     assertEquals(sequence, Arrays.asList(1, 2, 3, 4, 5, 6)); 
    } 

    import java.util.ArrayList; 
    import java.util.List; 

    public class MergeSort { 

     public static <E extends Comparable<E>> void mergeSort(List<E> list) { 
      if (list.size() > 1) { 
       // the first half of the list (always smaller than or equal to tail) 
       ArrayList<E> head = new ArrayList<>(list.subList(0, list.size()/2)); 
       // the second half of the list 
       ArrayList<E> tail = new ArrayList<>(list.subList(list.size()/2, list.size())); 
       //temporary list 
       ArrayList<E> temp = new ArrayList<>(); 

       if (head.size() > 1) { 
        mergeSort(head); 
       } 
       if (tail.size() > 1) { 
        mergeSort(tail); 
       } 

       // while either head or tail still has a member 
       while (head.size() > 0 || tail.size() > 0) { 
        // if both head and tail still have members 
        if (head.size() > 0 && tail.size() > 0) { 
         // if head is smaller than tail 
         if (head.get(0).compareTo(tail.get(0)) < 1) { 
          temp.add(head.get(0)); 
          head.remove(0); 
         } else { 
          temp.add(tail.get(0)); 
          tail.remove(0); 
         } 
         // if only head has members 
        } else if (head.size() > 0) { 
         temp.add(head.get(0)); 
         head.remove(0); 
         // if only tail has members 
        } else { 
         temp.add(tail.get(0)); 
         tail.remove(0); 
        } 
       } 

       // overwrite the old list with the sorted list 
       list = temp; 
       System.out.println(list); 
      } 
     } 

    } 
+1

この質問は決してそのようにマークされた1の正確な複製です。それがそれに関連していることは確かです。 – Andres

答えて

0
list = temp; 

この行は、あなたが引数として渡されたリストとは別のオブジェクトにメソッドポイントでリスト引数を作っています。以下のコメントとして

は言う:

Instead of reasigning list=temp which creates a new entity. copy the contents of temp to list. list.clear(); Collections.copyList(list,temp) 
+0

新しいエンティティを作成する 'list = temp'を再割り当てする代わりに。 tempの内容をリストにコピーします。 list.clear(); Collections.copyList(list、temp); 参照:例については、http://www.codejava.net/java-core/collections/java-list-collection-tutorial-and-examplesを参照してください。 – Dragonthoughts

+0

@Andresおそらく解決策がない – HYBR1D

関連する問題