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の正確な複製です。それがそれに関連していることは確かです。 – Andres