これで、Project Eulerの問題を解決するMergeSortについて今すぐ学習しています。MergeSort IllegalArgumentException
アルファベット順にリスト5163の名前をソートしようとしています。私はいくつかの調査を行い、MergeSortがかなり効率的な方法であることを発見しました。
私はこのlinkに基づいて実装をコーディングしました。
以下は私のmergeSort
およびmerge
の方法です。
Exception in thread "main" java.lang.IllegalArgumentException: fromIndex(1) > toIndex(0)
この行を指している:
List<String> rightSide = list.subList(list.size()/2 + 1, list.size());
public static List<String> mergeSort(List<String> list){
if (list.size() == 1){ //if fully divided
return list;
}
List<String> leftSide = list.subList(0, list.size()/2);
List<String> rightSide = list.subList(list.size()/2 + 1, list.size());
leftSide = mergeSort(leftSide);
rightSide = mergeSort(rightSide);
return merge(leftSide, rightSide);
}
public static List<String> merge(List<String> listA, List<String> listB){
List<String> listC = new LinkedList<String>();
while (!listA.isEmpty() & !listB.isEmpty()){ //while both have elements
if (listA.get(0).compareTo(listB.get(0)) > 1){ //if stringA is greater than stringB
listC.add(listA.get(0));
listA.remove(0);
} else { //if stringB is greater than stringA
listC.add(listB.get(0));
listB.remove(0);
}
}
while (!listA.isEmpty()){ //while listA has elements
listC.add(listA.get(0));
listA.remove(0);
}
while (!listB.isEmpty()){ //while listB has elements
listC.add(listB.get(0));
listB.remove(0);
}
return listC;
}
問題は、私がしようとすると名前の私のリストにmergeSort
メソッドを使用する場合、それは私に次のエラーを与えることです
なぜそれが起こっているのか分かりません。チュートリアルに示されているのとまったく同じ方法を使っているようです。
また、わかりましたが、このエラーは私のリストのサイズがゼロであることを私に伝えています。これは、list.size()/2 + 1
が1に等しく、list.size()
が0に等しくなる唯一の方法です。しかし、私のリストがなぜゼロかもしれないのか分かりません。サイズが1になるまで分割されるので、それが返されます。
ゼロに等しいと見ることができる唯一の方法は、最初はゼロだったが、私がlist.size()
が5163で始まることを確認した。
誰かが私が間違っていることを指摘するのに役立つでしょうか?私はそれが本当にシンプルなものだと確信していますが、私はこれを学び始めたばかりなので、それが何であるか分かりません。
EDIT:
私はここにリストのサイズをチェック:
System.out.println(namesArray.size()); //prints "5163"
namesArray = mergeSort(namesArray);
それでは、どのように私のリストは、これまでにゼロの大きさを持っているだろうか?
はい、これはちょうど今私がそれをデバッグして見つけたものです。私が正しいとすれば、+1を削除するとこのはいを修正する必要がありますか? –
はい。また、長さがゼロであることを確認し、実行時例外をスローします。このメソッドの呼び出し元が常に正しいことを行うことを保証することはできません。 –