Générer un type de tableau variable en sortie de méthode
Résolu
neocol
Messages postés
63
Date d'inscription
Statut
Membre
Dernière intervention
-
neocol Messages postés 63 Date d'inscription Statut Membre Dernière intervention -
neocol Messages postés 63 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
cette commande :
permet de faire une copie de arraySource, l'avantage qu'elle a cette commande, c'est qu'elle te permet une position de départ sourcePositionStart et une position d'arrêt sourcePositionStop. Il faut sourcePositionStart < sourcePositionStop. Elle retourne un tableau du même type(String, int, double ...) que arraySource.
Ma question est, comment écrire une méthode qui à elle permet de définir le type de arraySource alors la sortie doit être de même type que la source.J'ai essayé ce petit de code, mais je n'ai pas réussi:
Si vous avez des idées je serai reconnaissant,
Cordialement,
Merci
cette commande :
Arrays.copyOfRange(arraySource, sourcePositionStart, sourcePositionStop);
permet de faire une copie de arraySource, l'avantage qu'elle a cette commande, c'est qu'elle te permet une position de départ sourcePositionStart et une position d'arrêt sourcePositionStop. Il faut sourcePositionStart < sourcePositionStop. Elle retourne un tableau du même type(String, int, double ...) que arraySource.
Ma question est, comment écrire une méthode qui à elle permet de définir le type de arraySource alors la sortie doit être de même type que la source.J'ai essayé ce petit de code, mais je n'ai pas réussi:
public static Object[] customCloneArray(Object[] source, int sourcePositionStart, int sourcePositionStop){
Object[] ouput = null;
try {
if(source instanceof String[]){
ouput = (String[])Arrays.copyOfRange(source, sourcePositionStart, sourcePositionStop);
}else if(source instanceof Integer[]){
ouput = (Integer[])Arrays.copyOfRange(source, sourcePositionStart, sourcePositionStop);
}
} catch (java.lang.IllegalArgumentException e) {
e.printStackTrace();
}
return ouput;
}
Si vous avez des idées je serai reconnaissant,
Cordialement,
Merci
A voir également:
- Générer un type de tableau variable en sortie de méthode
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Generer mot de passe - Télécharger - Sécurité
- Imprimer un tableau excel - Guide
1 réponse
Bonjour,
Pour faire ce que tu veux il te manque la généricité, c'est à dire qu'au lieu de renvoyer Object[] il faudrait que tu renvoies un E[] où E est le même type que le tableau E[] de la source : on précise ce paramètre avec <E>
Remarque : écrite comme ça, cette méthode ne sert à rien, autant appeler directement Arrays.copyOfRange.
Plus dur : si tu voulais écrire toi même la méthode Arrays.copyOfRange, il te faudrait alors créer un nouveau tableau E[], malheureusement il est impossible de faire un new E[n] quand E est un type générique.
Pour résoudre ce problème il faut passer par le package java.lang.reflect.*
NB. À ce moment là le tableau est vide, il faut encore le remplir avec les bonnes valeurs au bon endroit.
Pour faire ce que tu veux il te manque la généricité, c'est à dire qu'au lieu de renvoyer Object[] il faudrait que tu renvoies un E[] où E est le même type que le tableau E[] de la source : on précise ce paramètre avec <E>
public static <E> E[] customCloneArray(E[] source, int sourcePositionStart, int sourcePositionStop) { return Arrays.copyOfRange(source, sourcePositionStart, sourcePositionStop); }
Remarque : écrite comme ça, cette méthode ne sert à rien, autant appeler directement Arrays.copyOfRange.
Plus dur : si tu voulais écrire toi même la méthode Arrays.copyOfRange, il te faudrait alors créer un nouveau tableau E[], malheureusement il est impossible de faire un new E[n] quand E est un type générique.
Pour résoudre ce problème il faut passer par le package java.lang.reflect.*
@SuppressWarnings("unchecked") E[] ouput = (E[]) Array.newInstance(source.getClass().getComponentType(), size);
NB. À ce moment là le tableau est vide, il faut encore le remplir avec les bonnes valeurs au bon endroit.
ne marche pas pour int[] newArray = customCloneArray(oldArray, integer, integer)
C'est d'ailleurs pour ça que toutes les méthodes de Arrays sont dupliquées une méthode pour les objets E (ou T, ou ce que l'on veut) et huit méthodes pour chacun des huit types primitifs. C'est moche mais il n'y a pas le choix.
Merci KX