0

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 としてキャストする必要がありますか。ここで少し混乱しています。ListLinkedListの両方の javadoc を参照してきました。

3) LinkedList の代わりに、List オブジェクトを使用してこれをすべて達成できますか? この例で LinkedList が選択された理由がわからないのですか? また、これを整数の配列で呼び出したい場合、配列がリストから継承しているように見えないため、途中で入力を別の方法でキャスト (?) する必要がありますか?

初めてJavaを実際に学習したばかりで、本当に基本的な質問で申し訳ありません。

4

2 に答える 2

1
  1. Listクイック ソート メソッドは、 Type の オブジェクトの を受け入れ、タイプのXを返します。型は、ジェネリック型のインターフェイスを実装する必要がありますListXXComparableX
  2. メソッドArrays.asList(<your-array>)を使用して、配列をリストに変換できます
  3. LinkedListメソッド コントラクトにはについての言及はありません。任意のタイプのListquickSortメソッドに渡すことができ、タイプ のオブジェクトが返されますList。メソッドによって内部的に使用されるLinkedListの実装です。List

元:

    Integer[] arr = { 1, 2, 3 };
    List<Integer> asList = Arrays.asList(arr);
    quickSort(asList);
于 2013-03-29T01:10:58.543 に答える
0

main メソッドのコードを次のコードに変更しました。

public static void main(String[] args){
        Integer[] arr = {2,3,1,6,2,87,5,3,546,9,2,3,8,111};
        List<Integer> asList = Arrays.asList(arr);
        List<Integer> mySortedArray = quickSort(asList);
        System.out.println(mySortedArray);
    }

アルゴリズムは現在完全に機能しています。

于 2014-05-04T00:44:00.283 に答える