Comment convertir Double en double ?

J’implémente une interface qui possède des fonctionnalités similaires à une table pouvant contenir des types d’objects. L’interface spécifie la fonction suivante:

double[] getDoubles(int columnIndex); 

Là où je suis coincé, c’est que dans mon implémentation, je stocke les données de la table dans un tableau d’ Object 2D (données Object[][] data ). Lorsque je dois retourner les valeurs, je veux faire ce qui suit (on suppose que getDoubles() ne sera appelé que sur une colonne contenant des doubles, donc il n’y aura pas d’ ClassCastExceptions ):

 double[] getDoubles(int columnIndex) { return (double[]) data[columnIndex]; } 

Mais – Java ne permet pas à Object[] d’être converti en double[] . Le lancer sur Double[] est correct car Double est un object et non une primitive, mais mon interface spécifie que les données seront renvoyées sous la forme d’un double[] .

J’ai donc deux questions:

  1. Est-ce que je peux obtenir les données de colonne de la table Object[][] et renvoyer le tableau de primitives?
  2. Si je change d’interface pour retourner Double[] , y aura-t-il un impact sur les performances?

Malheureusement, vous devrez parcourir toute la liste et annuler le Double si vous souhaitez le convertir en double[] .

En ce qui concerne les performances, il y a un certain temps associé aux primitives de boxing et de unboxing en Java. Si le jeu est suffisamment petit, vous ne verrez aucun problème de performance.

Si cela ne vous dérange pas d’utiliser une bibliothèque tierce, commons-lang a le type ArrayUtils avec différentes méthodes de manipulation.

 Double[] doubles; ... double[] d = ArrayUtils.toPrimitive(doubles); 

Il y a aussi la méthode complémentaire

 doubles = ArrayUtils.toObject(d); 

Edit: Pour répondre au rest de la question. Il y aura un peu de temps pour faire cela, mais à moins que le tableau ne soit vraiment gros, vous ne devriez pas vous en préoccuper. Testez-le d’abord pour voir si c’est un problème avant de refactoriser.

La mise en œuvre de la méthode que vous aviez demandée donnerait quelque chose comme ça.

 double[] getDoubles(int columnIndex) { return ArrayUtils.toPrimitive(data[columnIndex]); } 

En Java 8, il s’agit d’une ligne unique:

 Double[] boxed = new Double[] { 1.0, 2.0, 3.0 }; double[] unboxed = Stream.of(boxed).mapToDouble(Double::doubleValue).toArray(); 

Notez que cela continue à parcourir le tableau d’origine et en crée un nouveau.

Vous pouvez utiliser un pour chaque boucle pour construire un tableau temporaire de la même taille puis convertir chaque élément individuel en double et le placer dans le tableau.

ALORS:

 double[] tempArray = new double[data[columnIndex].length]; int i = 0; for(Double d : (Double) data[columnIndex]) { tempArray[i] = (double) d; i++; } 

S’il vous plaît corrigez-moi si je me trompe mal ici.

Si vous voulez retourner un double[] , vous devez créer un new double[] , le remplir et le renvoyer.

C’est peut-être une bonne décision d’architecture. Tout d’abord, il n’est pas très logique de lancer un Object[] sur un Double[] ; ce n’est pas vraiment un tableau de Double car il pourrait y avoir des Object s aussi. Deuxièmement, si vous retournez directement le tableau, le code utilisateur peut le modifier et modifier la structure interne de votre object.

Le principal impact sur les performances consisterait à renvoyer un tableau de double[] , en raison du déballage et du coût de l’allocation.

Je n’ai rien à append à la vraie question au-delà de ce que jjnguy et Eric Koslow ont dit.

Mais juste une note de côté: vous parlez de lancer un tableau d’objects dans un tableau double. Ce qui suit ne fonctionnera pas:

 Object[] oa=new Object[3]; oa[0]=new Double("1.0"); oa[1]=new Double("2.0"); oa[2]=new Double("3.0"); Double[] da=(Double[])oa; 

La dernière ligne lancera une exception de conversion de classe. Même si chaque élément du tableau est effectivement un double, le tableau a été créé sous la forme d’un tableau d’objects, et non d’un tableau de doubles, de sorte que la dissortingbution n’est pas valide.

Je voudrais seconder la réponse de ArrayUtils et append que la documentation de la version 1.5 automatique ( via ) révèle qu’il n’existe pas de méthode intégrée:

Il n’y a pas de conversion autorisée du type de tableau SC [] au type de tableau TC [] s’il n’y a pas de conversion autorisée autre qu’une conversion de chaîne de SC à TC

Vous pouvez utiliser les ArrayUtils pour convertir

 Double[] d; // initialise double[] array = ArrayUtils.toPrimitive(d); 

Pas besoin de boucler la totalité des données.