0

整数を使用して選択ソートを実行しましたが、機能していましたが、ジェネリックを使用するようにプログラムを変更しようとすると、コンパイラーが不平を言い、修正方法がわかりません。誰かがいくつかのヒントや建設的なコメントを指摘できれば、私は感謝しています. これがコードです。

public class SelelctionSort 
{
    public static void main(String[] args) 
    {
        int[] list = {34, 17, 23, 35, 45, 9, 1};
        System.out.println("Original Array: ");
        printArray(list);

        selectionSort(list);
        System.out.println("\nSelection sort:");
        printArray(list);

    }

    //selection sort
    public static <E extends Comparable<E>> void selectionSort(E[] list)
    {
        for(int i=0; i<list.length -1; i++)
        {
            int iSmallest = i;

            for(int j=i+1; j<list.length; j++)
            {
                if(list[iSmallest].compareTo((list[j])) > 0  )
                {
                    iSmallest = j;
                }
            }
            E iSwap = list[iSmallest];
            list[iSmallest] = list[i];
            list[i] = iSwap;

        }
    }

    public static <E> void printArray(E[] list)
    {

        for(int i=0; i<list.length; i++)
        {
            System.out.print(list[i] + ", ");
        }
    }
}

以下はjavac吐き出すものです。

SelelctionSort.java:7: error: method printArray in class SelelctionSort cannot be applied to given types;
        printArray(list);
        ^
  required: E[]
  found: int[]
  reason: inferred type does not conform to declared bound(s)
    inferred: int
    bound(s): Object
  where E is a type-variable:
    E extends Object declared in method <E>printArray(E[])
SelelctionSort.java:9: error: method selectionSort in class SelelctionSort cannot be applied to given types;
        selectionSort(list);
        ^
  required: E[]
  found: int[]
  reason: inferred type does not conform to declared bound(s)
    inferred: int
    bound(s): Comparable<int>
  where E is a type-variable:
    E extends Comparable<E> declared in method <E>selectionSort(E[])
SelelctionSort.java:11: error: method printArray in class SelelctionSort cannot be applied to given types;
        printArray(list);
        ^
  required: E[]
  found: int[]
  reason: inferred type does not conform to declared bound(s)
    inferred: int
    bound(s): Object
  where E is a type-variable:
    E extends Object declared in method <E>printArray(E[])
4

3 に答える 3

4
int[] list = {34, 17, 23, 35, 45, 9, 1};
...
selectionSort(list);

selectionSort()どの署名がであるかを呼び出そうとしていますがselectionSort(E[])int拡張されていませんComparable(これはプリミティブであり、オブジェクトでさえありません) - したがって、型が一致しません。

を作成しInteger[]て渡すことができます。Integerはオブジェクトであり、拡張しComparable<Integer>ます。
別の方法は、オブジェクトのジェネリック型の両方を受け入れるようにオーバー selectionSort()ロードし、必要なプリミティブごとにオーバーロードすることです。これは、Java がそのArrays.sort()メソッドに使用するソリューションです。

同じことが当てはまりますprintArray()

于 2012-08-26T06:29:04.333 に答える
1

上記のようにselectionSort(E[])、 E extends Comparable means を使用している場合、選択ソートは Comparable インターフェイスを実装した引数を取ることができます。int はプリミティブ データであるため、コンパイル エラーが発生します。したがって、汎用機能が必要な場合は、ラッパー クラスを使用できます。すべてのラッパー クラスは Comparable インターフェイスを実装しています。以下のコードは機能します。コードのバージョンを編集するだけです

public class SelelctionSort 
{
public static void main(String[] args) 
{
    Integer[] list = {34, 17, 23, 35, 45, 9, 1};
    System.out.println("Original Array: ");
    printArray(list);

    selectionSort(list);
    System.out.println("\nSelection sort:");
    printArray(list);
    Float[] flist = {34.4f, 17.6f, 23.0f};
    selectionSort(list);
}

//selection sort
public static <E extends Comparable<E>> void selectionSort(E[] list)
{
    for(int i=0; i<list.length -1; i++)
    {
        int iSmallest = i;

        for(int j=i+1; j<list.length; j++)
        {
            if(list[iSmallest].compareTo((list[j])) > 0  )
            {
                iSmallest = j;
            }
        }
        E iSwap = list[iSmallest];
        list[iSmallest] = list[i];
        list[i] = iSwap;

    }
}

public static <E> void printArray(E[] list)
{

    for(int i=0; i<list.length; i++)
    {
        System.out.print(list[i] + ", ");
    }
}
}
于 2012-08-26T06:37:18.520 に答える
-1

実際に機能していますこのソリューションはすべてのタイプの変数で機能しており、文字列変数を渡すとエラーが表示されます

于 2015-08-15T11:36:12.590 に答える