Rosettacode で、Java で実装されたクイックソートのこの例に従っています。私が理解していることから、これは Comparable インターフェースを実装するものの配列を取り込むことになっており、その型は実行時に推測されます。これを main メソッドを含む小さなクラスにまとめましたが、推論された型に関する多くのエラーが発生します。私はJavaに比較的慣れていないため、この構造にはまだ慣れていません。
import java.util.List;
import java.util.LinkedList;
public class QuickSortExample {
public static <E extends Comparable<? super E>> List<E> quickSort(List<E> arr) {
if (arr.size() <= 1) return arr;
E pivot = arr.getFirst();
List<E> less = new LinkedList<E>();
List<E> pivotList = new LinkedList<E>();
List<E> more = new LinkedList<E>();
for (E i: arr) {
if (i.compareTo(pivot) < 0) less.add(i);
else if (i.compareTo(pivot) > 0) more.add(i);
else pivotList.add(i);
}
less = quickSort(less);
more = quickSort(more);
less.addAll(pivotList);
less.addAll(more);
return less;
}
public static void main(String[] args){
int[] myArray = new int[]{2,3,1,6,2,87,5,3,546,9,2,3,8,111};
int[] mySortedArray = quickSort(myArray);
System.out.println(mySortedArray);
}
}
そして、コンパイル時にこれらのエラーが発生します
$ javac QuickSortExample.java
QuickSortExample.java:11: cannot find symbol
symbol : method getFirst()
location: interface java.util.List<E>
E pivot = arr.getFirst();
^
QuickSortExample.java:37: <E>quickSort(java.util.List<E>) in QuickSortExample cannot be applied to (int[])
int[] mySortedArray = quickSort(myArray);
^
2 errors
3 つの質問があります。
1) は何をしますか? 次のステートメントの意味は?
<E extends Comparable<? super E>> List<E> quickSort(List<E> arr)
2) getFirst() メソッドにより、これは LinkedList オブジェクトで動作するように作られているようです。あれは正しいですか?もしそうなら、これを一般的なリストで動作させることはできますか? int の配列を List としてキャストする必要がありますか。ここで少し混乱しています。ListとLinkedListの両方の javadoc を参照してきました。
3) LinkedList の代わりに、List オブジェクトを使用してこれをすべて達成できますか? この例で LinkedList が選択された理由がわからないのですか? また、これを整数の配列で呼び出したい場合、配列がリストから継承しているように見えないため、途中で入力を別の方法でキャスト (?) する必要がありますか?
初めてJavaを実際に学習したばかりで、本当に基本的な質問で申し訳ありません。