La création d'un nouveau générique de type tableau à l'aide du Tableau.newInstance()
Pour la pratique, je suis en train de mettre en œuvre la fusion algorithme de tri mais il est resté coincé assez vite lorsque l'on essaie d'instancier un type générique de la matrice. Je ne suis pas entièrement sûr si mon plan de travail, mais pour l'instant, la partie la plus intéressante (ou frustrant, selon le moment où vous me demandez) est la deuxième ligne de la méthode merge (). La méthode newInstance() a besoin de savoir dans quelle classe il doit initier, mais même si arr1.getClass() compile parfaitement bien, il ne fonctionne pas lors de l'exécution.
public void mergeSort(T[] arr) {
T[] merged = merge(Arrays.copyOfRange(arr, 0, arr.length/2), Arrays.copyOfRange(arr, arr.length/2+1, arr.length-1));
}
@SuppressWarnings({"unchecked"})
public T[] merge(T[] arr1, T[] arr2) {
//A new array of type T that will contain a merged version of arr1 and arr2
T[] merged = (T[]) Array.newInstance(arr1.getClass(), arr1.length+arr2.length);
int i1 = 0, i2 = 0;
for (int i = 0; i < arr1.length + arr2.length; i++) {
if (arr1[i1].compareTo(arr2[i2]) < 0) {
merged[i] = arr1[i1];
i1++;
} else {
merged[i] = arr2[i2];
i2++;
}
}
return merged;
}
Le message d'erreur est:
Exception in thread "main" java.lang.ClassCastException: [[Ljava.lang.String; cannot be cast to [Ljava.lang.Comparable;
at sort.SortingAndSearching.merge(SortingAndSearching.java:94)
at sort.SortingAndSearching.mergeSort(SortingAndSearching.java:84)
at sort.SortingAndSearching.main(SortingAndSearching.java:19)
OriginalL'auteur Jimmy C | 2012-10-08
Vous devez vous connecter pour publier un commentaire.
Crois que je vois le problème... Quand vous ne
Array.newInstance(...)
, il prend le type de composant (dans votre cas, vous voulez qu'il soit de Chaîne). Cependant, vous êtes à la remise de la classe array (arr1 est de type String [] et que vous êtes en train de fairearr1.getClass()
). Au lieu de cela, fairepour obtenir le
String
classe deString[]
Par javadoc:
OriginalL'auteur Alex Coleman
J'ai copié et collé le code que vous avez donné et il n'a même pas compiler. Après avoir fait quelques corrections, je suis arrivé à ceci:
Puisque vous utilisez la
compareTo
méthode, vous devez indiquer au compilateur queT
implémente cette interface.implements Comparable
dans la déclaration de classe.OriginalL'auteur vainolo