2016-12-15 3 views
3

ジェネリックスの仕組みを理解しようとしました。私はアルゴリズムを並べ替え、いくつかの実装を作成し、ソートする前に、私はAbstractSorter.javaでshuffleArray方法により入力配列をシャッフル:ジェネリックアレイのシャッフルアルゴリズム

public class AbstractSorter<T extends Comparable> { 

public void swap(final T[] input, int srcPos, int dstPos) { 
    if (dstPos != srcPos) { 
     T accum = input[dstPos]; 
     input[dstPos] = input[srcPos]; 
     input[srcPos] = accum; 

    } 
} 

public T[] shuffleArray(final T[] inputArray) { 
    //  E[] arr = (E[])new Object[INITIAL_ARRAY_LENGTH]; 
    T[] result = (T[]) new Comparable[inputArray.length]; 
    System.arraycopy(inputArray, 0, result, 0, inputArray.length); 
    int index; 
    Random random = new Random(); 
    for (int i = result.length - 1; i > 0; i--) { 
     index = random.nextInt(i + 1); 
     if (index != i) { 
      swap(result, i, index); 
     } 
    } 
    return result; 
} 

public boolean more(final T x, final T y) { 
    return (x.compareTo(y) > 0); 
} 

しかし、私は次のように使用しようとすると:

AbstractSorter<Integer> sortHelper = new AbstractSorter(); 
Integer[] expResult = new Integer[]{-30, -29, -28, -27 }; 
Integer[] shuffleArray = sortHelper.shuffleArray(expResult); 
System.out.println("Array ="+Arrays.toString(shuffleArray)); 

それは私が例外が発生しました:

java.lang.ClassCastException: 
[Ljava.lang.Comparable; cannot be cast to [Ljava.lang.Integer; 

どのようにシャッフル方法を修正できますかわかりません。この機能を配列に実装することは可能ですか、コレクションに移行する必要がありますか?

ありがとうございます!

+0

と何が間違っていますinbuiltシャッフルメソッドはなぜそれを使用しない? https://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle(java.util。リスト) – StackFlowed

+0

'T extend Comparable 'ではないでしょうか? – maraca

+0

@StackFlowed私は配列を使用し、リストに移行したいと思います。しかし、私は他の方法がない場合。 –

答えて

1

あなたが違法であるIntegerオブジェクトの配列にComparableオブジェクトの配列を変換しようとしているので、あなたが例外を取得している理由があります。 IntegerからComparableにのみキャストできますが、それ以外の方法ではキャストできません。

これはあなたの問題です:T[] result = (T[]) new Comparable[inputArray.length];。ここでは、このケースでIntegerあるTからComparableをキャストしています。例を実行する

public T[] shuffleArray(final T[] inputArray) { 
    T[] result = Arrays.copyOf(inputArray, inputArray.length); 
    int index; 
    Random random = new Random(); 
    for (int i = result.length - 1; i > 0; i--) { 
     index = random.nextInt(i + 1); 
     if (index != i) { 
      swap(result, i, index); 
     } 
    } 
    return result; 
} 

:ので、あなたのshuffleArray方法がどのように見える

変更ラインT[] result = Arrays.copyOf(inputArray, inputArray.length);からT[] result = (T[]) new Comparable[inputArray.length];System.arraycopy(inputArray, 0, result, 0, inputArray.length);

AbstractSorter<Integer> sortHelper = new AbstractSorter(); 
Integer[] expResult = new Integer[]{-30, -29, -28, -27}; 
Integer[] shuffleArray = sortHelper.shuffleArray(expResult); 

System.out.println ("Array =" + Arrays.toString(shuffleArray)); 

は、結果を生成します:Array =[-30, -28, -29, -27]

1

Comparableの配列を作成しようとしていますが、予想される配列はIntegerの配列です。

含まれているオブジェクトが親であっても、何かの配列を別の配列にキャストすることはできません。

しかし、あなたが言ったように、我々は簡単に、一般的なオブジェクトの配列を作成することはできませんので、私は交換してくださいHow to create a generic array in Java?

に参照さ:

T[] result = (T[]) new Comparable[inputArray.length]; 

で:

final T t = inputArray[0]; 
T[] result = (T[]) Array.newInstance(t.getClass(), inputArray.length); 
+0

申し訳ありませんが、私のクラスをコンパイルすることはできません - 一般的な配列の作成 –

+0

@JohnBl:答えを編集しました – Berger

0

きっとあなたを次のようにしてください:

public class AbstractSorter<T extends Comparable<T>> 

T[] result = (T[]) new Comparable<T>[inputArray.length]; 

AbstractSorter<Integer> sortHelper = new AbstractSorter<>(); 
関連する問題