2012-02-01 18 views
6

Tengo una matriz de cadenas como:Cómo convertir Array cadena de matriz doble en una línea

String[] guaranteedOutput = Arrays.copyOf(values, values.length, 
String[].class); 

Todos los valores de cadena son los números. Los datos se deben convertir a Double[].

Pregunta
¿Existe una solución de una línea en Java para lograr esto o tenemos que bucle y convertir cada valor a un doble?

+1

Tendrá que hacer un ciclo. – Jivings

+0

¿Por qué no 'double []'? Es mas rapido. –

+0

Haz un bucle y convierte cada uno de ellos, es lo que puedes hacer. – asgs

Respuesta

6

Cree un método para implementarlo mediante un bucle, luego llame a su método, y tendrá una solución de una línea.

No hay un método de inserción en la API de Java para hacerlo.

0

Creo que tendrá que recorrer y convertir cada valor en un doble. Así es como lo hice en una de mis otras preguntas:

for(getData : getDataArray){ 
double getTotal; 
getTotal = getTotal + Double.parseDouble(getData); 
} 
return getTotal; 

La idea es la misma. Convierte eso en un método, pasa tus parámetros y eres dorado.

+0

Excepto que le falta un tipo en su bucle for; y si quiere obtener una matriz (a diferencia de una lista a la que puede anexar), en realidad necesitará saber el índice entero. –

+0

No aclaré que el código que proporcioné es un recorte de un script de Beanshell en el que trabajé, de ahí la falta de un tipo de datos. – Carlos

0

¿Qué hay de malo en un bucle?

double[] parsed = new double[values.length]; 
for (int i = 0; i<values.length; i++) parsed[i] = Double.valueOf(values[i]); 

no es particularmente torpe. Además, puede agregar fácilmente el manejo correcto de errores.

Por supuesto, puede envolver fácilmente esto como desee.

OpenJDK8 probablemente traerá expresiones lambda, y usar Double.valueOf como función de "mapa" sería un buen ejemplo para usar esto.

1
CollectionUtils.collect(guaranteedOutput, new Transformer() { 
     public Object transform(Object i) { 
      return Double.parseDouble(i); 
     } 
}); 

EDITAR

Tenga en cuenta que esto no es en JavaSDK! Estoy usando http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html

+1

Faltaba un punto y coma y el formateo dificultaba la lectura; arregló eso. También vale la pena señalar que esto no forma parte de core java, sino que forma parte de 'org.apache.commons.collections'; dicho esto, excelente respuesta. (Te haría +1, pero no tengo votos para el día) –

+0

¡lol! gracias por la edición! ¡Me gustan las colecciones comunes para este propósito! –

1

Desea una operación de mapa de la programación funcional, que desafortunadamente Java no ofrece. En su lugar, usted tiene que bucle como

double[] nums = new double[guaranteedOutput.length]; 
for (int i = 0; i < nums.length; i++) { 
    nums[i] = Double.parseDouble(guaranteedOutput[i]); 
} 
5

En una línea: p

Double[] d=new ArrayList<Double>() {{for (String tempLongString : tempLongStrings) add(new Double(tempLongString));}}.toArray(new Double[tempLongStrings.length]); 
19

Java 8 Stream API permite hacer esto:

double[] doubleValues = Arrays.stream(guaranteedOutput) 
         .mapToDouble(Double::parseDouble) 
         .toArray(); 

de colon doble se utiliza como método de referencia. Read more here.

Antes de utilizar el código no se olvide de import java.util.Arrays;

UPD: Si desea emitir su matriz para doblar [], no doble [], puede utilizar el siguiente código:

Double[] doubleValues = Arrays.stream(guaranteedOutput) 
         .map(Double::valueOf) 
         .toArray(Double[]::new); 
Cuestiones relacionadas