2010-01-07 11 views
18

Tengo una serie de flotadores y me gustaría convertirlo en una matriz de dobles en Java. Soy consciente de la forma obvia de iterar sobre la matriz y crear una nueva. Esperaba que Java dijera un flotador [] sin problemas donde desea trabajar con doble [] ... pero no puede funcionar con esto. ¿Cuál es la forma elegante y efectiva de hacer esta conversión?Cómo convertir una matriz de flotantes a una matriz de dobles en Java?

+1

No hay forma de hacerlo "elegantemente" porque flotante y doble son tipos de datos totalmente diferentes por tamaño y patrón de bits. Entonces, la forma obvia es la única. –

Respuesta

30

Básicamente algo tiene que hacer la conversión de cada valor. No hay una conversión implícita entre los dos tipos de matriz porque el código utilizado para manejarlos después de JITting sería diferente: tienen un tamaño de elemento diferente y el flotante necesitaría una conversión, mientras que el doble no. Compare esto con la covarianza de matriz para tipos de referencia, donde no se requieren conversiones al leer los datos (el patrón de bits es el mismo para una referencia de cadena como referencia de objeto, por ejemplo) y el tamaño del elemento es el mismo para todos los tipos de referencia.

En resumen, algo tendrá que realizar las conversiones en un bucle. No conozco ningún método incorporado para hacer esto. Estoy seguro de que existen en bibliotecas de terceros en alguna parte, pero a menos que ya estés usando una de esas bibliotecas, solo escribiría tu propio método. Por razones de conveniencia, aquí hay un ejemplo de implementación:

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

También podría convertirlo en un método de extensión. – Seth

+3

@Seth: Esto es Java, no C#. –

+0

Puede ponerle el nombre 'convertToDoubles' o' toDoubles' y proporcionar sobrecargas para otros tipos primitivos (y encuadrados). –

1

¿Es usted realmente necesita para copiar su red de flotadores a una matriz doble? Si usted está teniendo problemas con el compilador y los tipos cuando se usan los flotadores que puede utilizar este ...

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

¿Qué ventaja se obtiene mediante la adopción de una copia? Si necesita una mayor precisión en los resultados de los cálculos basados ​​en los flotadores, haga los resultados double. Puedo ver bastantes inconvenientes para tener una copia de la matriz y realizar la función de copia, especialmente si es grande. Asegúrate de que realmente necesites hacerlo.

HTH

+1

Veo una razón muy obvia: llamar a un método que necesita 'doble []' mientras tiene sus datos en 'float []'. –

+0

obviamente, pero el OP no menciona eso. Solo quería dar una alternativa ya que él lo pidió. – Simon

+0

Andreas_D lo explicó. Necesitaba hacer dos bibliotecas para jugar entre ellas. Uno de ellos funciona con vectores dobles [], el otro con float [] (vector en el significado matemático). Los problemas de Java con las matrices de transmisión, la coincidencia de estas bibliotecas no es tan simple. Parece que no existe ninguna solución sin la necesidad de recorrer el conjunto. Gracias por la respuesta. – fifigyuri

7

En Java 8 se puede, si realmente quieren, hacer:

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

Pero es mejor (más limpio, más rápido, mejor semántica) para utilizar la función de Jon Skeet.

+0

No creo que Jon Skeet sea mejor. De hecho, este podría ser optimizado mucho más rápido y hecho en paralelo.Está claro lo que está sucediendo y bien podría convertirse en el equivalente funcional de (double []) floatArray. La razón para usar streams es para que le diga al compilador que no nos importa cómo se hace o en qué orden, simplemente asigne todos estos valores a estos otros. En lugar de recorrerlos externamente. – Tatarize

Cuestiones relacionadas