要素が Comparable を実装している限り、ジェネリック リストで再帰的なマージ ソートを行うクラスがあります。mergeSort(List toSort) という void メソッドと、既に並べ替えられた 2 つのリストを取得し、それらを 1 つの並べ替えられたリストに結合するメソッド mergeSortedLists(List left, List right) があります。問題は、mergeSort(...) メソッドが toSort 変数を操作していないように見えることです。それはそうですが、レベルを上げた後、変更は表示されません。並べ替え方法は次のとおりです。
public static <E extends Comparable<E>> void mergeSort(List<E> toSort)
{
if(toSort.size() > 1)
{
List<E> temp = toSort.subList(0, toSort.size()/2);
ArrayList<E> left = new ArrayList<E>(0);
for(E e : temp) left.add(e);
temp = toSort.subList(toSort.size()/2, toSort.size());
ArrayList<E> right = new ArrayList<E>(0);
for(E e : temp) right.add(e);
if(right.size() != 1) mergeSort(right);
if(left.size() != 1) mergeSort(left);
toSort = mergeSortedLists(left, right);
}
}
public static <E extends Comparable<E>> List<E> mergeSortedLists(List<E> leftList, List<E> rightList)
{
ArrayList<E> list = new ArrayList<E>();
while(!leftList.isEmpty() && !rightList.isEmpty())
{
if((leftList.get(0)).compareTo(rightList.get(0)) <= 0)
list.add(leftList.remove(0));
else
list.add(rightList.remove(0));
}
while(!leftList.isEmpty())
list.add(leftList.remove(0));
while(!rightList.isEmpty())
list.add(rightList.remove(0));
return list;
}
私は通常、エラーチェック用の print ステートメントを持っています。それらは、mergeSortedLists(...) が正しくソートされ、正しいリストを返すことを示しています。次に、mergeSort(...) の toSort 変数を、mergeSortedLists(...) が返すものに割り当てます。その割り当ては機能します。ここで、そのリストを別のリストと結合するためにレベルを上にジャンプすると、変更が失われたように見えます。何が起こっているのかわかりません。