2010-01-07 5 views
18

J'ai un tableau de flottants et je voudrais le convertir en un tableau de doubles en Java. Je suis conscient de la manière évidente d'itérer le tableau et d'en créer un nouveau. Je m'attendais à Java pour digérer un float [] en douceur où il souhaite travailler avec double [] ... mais ça ne peut pas fonctionner avec ça. Quelle est la manière élégante et efficace de faire cette conversion?Comment convertir un tableau de flottants en un tableau de doubles en Java?

+1

Il n'y a aucun moyen de le faire "élégamment" parce que float et double sont des types de données totalement différents par taille et modèle de bits. Donc, le moyen le plus évident est le seul. –

Répondre

30

Fondamentalement quelque chose doit faire la conversion de chaque valeur. Il n'y a pas de conversion implicite entre les deux types de tableaux parce que le code utilisé pour les gérer après JITting serait différent - ils ont une taille d'élément différente, et le flottant aurait besoin d'une conversion alors que le double ne le ferait pas. Comparez cela à la covariance de tableau pour les types de référence, où aucune conversion n'est requise lors de la lecture des données (le modèle binaire est identique pour une référence String comme référence Object) et la taille de l'élément est la même pour tous les types de référence. En résumé, devra effectuer des conversions dans une boucle. Je ne connais aucune méthode intégrée pour le faire. Je suis sûr qu'ils existent dans des bibliothèques tierces quelque part, mais à moins que vous n'utilisiez déjà l'une de ces bibliothèques, j'écrirais simplement votre propre méthode. Par souci de commodité, voici un exemple d'implémentation:

public static double[] convertFloatsToDoubles(float[] input) 
{ 
    if (input == null) 
    { 
     return null; // Or throw an exception - your choice 
    } 
    double[] output = new double[input.length]; 
    for (int i = 0; i < input.length; i++) 
    { 
     output[i] = input[i]; 
    } 
    return output; 
} 
+0

Vous pourriez en faire une méthode d'extension aussi. – Seth

+3

@Seth: Ceci est Java, pas C#. –

+0

Vous pouvez le nommer 'convertToDoubles' ou' toDoubles' et fournir des surcharges pour d'autres types primitifs (et encadrés). –

1

Avez-vous réellement besoin de copier votre tableau flottant à un double tableau? Si vous rencontrez des problèmes avec le compilateur et types lorsque vous utilisez les flotteurs vous pouvez l'utiliser ...

float x = 0; 
double d = Double.valueOf(x); 

Quel avantage obtenez-vous en prenant une copie? Si vous avez besoin d'une plus grande précision dans les résultats des calculs basés sur les flotteurs alors faites les résultats double. Je peux voir beaucoup d'inconvénients à avoir une copie du tableau et à exécuter la fonction de copie, surtout si elle est grande. Assurez-vous que vous avez vraiment besoin de le faire.

HTH

+1

Je vois une raison très évidente: appeler une méthode qui a besoin d'un 'double []' alors que vous avez vos données dans un 'float []'. –

+0

évidemment, mais l'OP ne mentionne pas cela. Je voulais juste donner une alternative puisqu'il l'a demandée. – Simon

+0

Andreas_D l'a expliqué. J'avais besoin de faire deux bibliothèques pour jouer les unes avec les autres. L'un des deux travaille alors avec des vecteurs doubles [], l'autre avec float [] (vecteur dans la signification mathématique). Les problèmes de Java avec les matrices de moulage, correspondant à ces bibliothèques n'est pas si simple. Il semble qu'il n'existe aucune solution sans avoir à boucler la baie. Merci pour la réponse. – fifigyuri

7

En Java 8 vous pouvez, si vous voulez vraiment, faire:

IntStream.range(0, floatArray.length).mapToDouble(i -> floatArray[i]).toArray(); 

Mais il est mieux (plus propre, plus rapide, une meilleure sémantique) pour utiliser la fonction de Jon Skeet.

+0

Je n'achète pas que Jon Skeet est meilleur. En fait, celui-ci pourrait être optimisé beaucoup plus rapidement et fait en parallèle.Il est clair ce qui se passe et pourrait bien être transformé en l'équivalent fonctionnel de (double []) floatArray. La raison d'utiliser les flux est de dire au compilateur que nous ne nous soucions pas de savoir comment cela est fait ou dans quel ordre, il suffit de mapper toutes ces valeurs à ces autres. Plutôt que de les traverser à l'extérieur. – Tatarize

Questions connexes