63 votes

Comment puis-je convertir Double[] double[]?

Je me suis mise en œuvre d'une interface qui possède des fonctionnalités similaires à un tableau qui peut contenir un des types d'objets. L'interface spécifie la fonction suivante:

double[] getDoubles(int columnIndex);

Là où je suis perplexe, c'est que dans mon application, je suis stocker les données d'une table dans un 2D Object tableau (Object[][] data). Quand j'ai besoin de retourner la valeur, je veux faire la chose suivante (on suppose que getDoubles() sera appelée uniquement sur une colonne qui contient des doubles, donc il n'y aura pas de ClassCastExceptions):

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

Mais Java n'autorise pas l'Objet[] d'être jeté à double[]. Moulage Double[] est ok, car Double est un objet et non primitive, mais mon interface spécifie que les données seront retournées comme un double[].

J'ai donc deux questions:

  1. Est-il possible que je puisse obtenir les données de la colonne de l'Objet[][] table et retourner le tableau de primitives?
  2. Si je ne la modification de l'interface à Double[], il n'y aura aucune incidence sur les performances?

86voto

Rich Seller Points 46052

Si vous n'avez pas l'esprit à l'aide d'un 3ème partie de la bibliothèque, commons-lang a la ArrayUtils type avec de diverses 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 reste de la question. Il y aura une surcharge de le faire, mais à moins que le tableau est vraiment grand, vous ne devriez pas vous inquiéter à ce sujet. D'abord tester pour voir si c'est un problème avant le refactoring.

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

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

33voto

jjnguy Points 62123

Malheureusement, vous aurez besoin d'une boucle sur l'ensemble de la liste et unbox l' Double si vous voulez convertir à un double[].

Comme la mesure de la performance va, il y a quelques temps, associé à boxing et unboxing primitifs en Java. Si l'ensemble est assez petit, vous ne verrez pas de problèmes de performances.

7voto

Eric Koslow Points 769

Vous pouvez utiliser une boucle for each pour construire un temp tableau de la même taille puis jeté de chaque élément individuel de double et de mais il dans le tableau.

DONC:

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 j'ai tort ici.

3voto

John Calsbeek Points 19381

Si vous vouliez retourner un double[], vous devez créer un new double[], le remplir, et de retour que.

Qui peut être une bonne architecture de décision. Tout d'abord, il ne fait pas beaucoup de sens de jeter un Object[] d'un Double[]; il n'est pas vraiment un tableau d' Double , parce qu'il pourrait être Objects en trop. Deuxième, si vous retournez le tableau directement, le code d'utilisateur peut le modifier et de modifier la structure interne de l'objet.

Le principal impact sur les performances seraient en renvoyant un tableau d' double[], en raison de déballage et le coût de l'allocation.

0voto

svrist Points 3408

Je voudrais deuxième la ArrayUtils répondre et d'ajouter que le 1.5 l'autoboxing documentation(via) un peu révèle qu'il n'est pas intégré de manière:

Il n'est pas permis de la conversion à partir de la matrice de type SC[] de la matrice de type TC[] si il n'est pas permis de conversion autres qu'une chaîne de conversion de SC de TC

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X