2016-12-15 3 views
3

Ich habe versucht zu verstehen, wie Generika funktioniert. Ich habe mehrere Implementierungen Sortieralgorithmen und vor dem Sortieren i Eingangsarray schlurfend durch shuffleArray Methode in AbstractSorter.java:Shuffle-Algorithmus auf generische Array

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); 
} 

aber wenn ich versuche, so zu verwenden:

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)); 

es ich habe Ausnahme :

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

Ich verstehe nicht, wie ich Shuffle-Methode beheben kann. Ist es möglich, diese Funktionalität auf Arrays zu implementieren oder sollte ich in Sammlungen migrieren?

Vielen Dank im Voraus!

+0

was mit falsch die eingebaute Shuffle-Methode, warum nicht verwenden? https://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle(java.util.Liste) – StackFlowed

+0

Sollte es nicht sein? T erstreckt sich vergleichbar ? – maraca

+0

@StackFlowed Ich benutze Arrays und würde gerne in die Liste migrieren. Aber wenn es keinen anderen Weg gibt, werde ich es tun. –

Antwort

1

Der Grund, warum Sie die Ausnahme, wenn es darum, weil Sie versuchen, eine Reihe von Comparable Objekte auf ein Array von Integer Objekte zu konvertieren, was illegal ist. Sie können nur von Integer zu Comparable gießen, nicht umgekehrt.

Dies ist Ihr Problem: T[] result = (T[]) new Comparable[inputArray.length];. Hier werfen Sie einen Comparable zu T, der in diesem Fall ein Integer ist.

ändern die Linien T[] result = (T[]) new Comparable[inputArray.length]; und System.arraycopy(inputArray, 0, result, 0, inputArray.length);-T[] result = Arrays.copyOf(inputArray, inputArray.length); so Ihre shuffleArray Methode wie folgt aussieht:

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; 
} 

das Beispiel mit Lauf:

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)); 

erzeugt das Ergebnis: Array =[-30, -28, -29, -27]

1

Sie versuchen, ein Array von Comparable zu erstellen, aber das erwartete Array ist ein Array von Integer.

Sie können ein Array von etwas nicht in ein Array von etwas anderem umsetzen, obwohl die enthaltenen Objekte Eltern sind.

Aber wie Sie gesagt haben, können wir nicht einfach eine Reihe von generischen Objekten erstellen, so dass ich refered zu How to create a generic array in Java?

ersetzen:

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

mit:

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

Sorry, aber ich kann meine Klasse überhaupt nicht kompilieren - generische Array-Erstellung –

+0

@JohnBl: gerade die Antwort bearbeitet – Berger

0

Sie Sicher möchte folgendes:

public class AbstractSorter<T extends Comparable<T>> 

und

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

und

AbstractSorter<Integer> sortHelper = new AbstractSorter<>(); 
Verwandte Themen