2011-06-22 32 views
6

Alguien me preguntó: ¿una matriz en java puede contener enteros y flotantes? Ella recibió la pregunta de un maestro.¿Puede una matriz contener enteros y flotantes?

Ahora mi respuesta fue: sí, ya que puede declarar una matriz de objetos y almacenar enteros y flotantes en ella.

Pero ahora me pregunto si eso es correcto, ya que técnicamente cuando almacena objetos enteros y flotantes en una matriz, de algún modo contiene ambos tipos, pero si le "pregunta" a la matriz, le diría que contiene objetos, y si no hago contabilidad o verificaciones de clase, no hay forma de saber que hay enteros y flotantes en la matriz.

Por otro lado, todavía siento que podría ser la respuesta correcta, ya que teóricamente la matriz contiene objetos de ambos tipos.

Así que estoy pidiendo una opinión inteligente: si se le preguntara (en una entrevista, una prueba) si en Java una matriz puede contener números enteros y flotantes, sí o no? ¿Qué responderías?

+2

Mi respuesta será afirmativa, y la explica muy bien. –

Respuesta

15

A int de float no encaja en una matriz Object[]. Sin embargo, por autoboxing java pondrá un Float o Integer en la matriz en su lugar.

Ambos Float y Integer extienden Number. Así que incluso se puede hacer una matriz de números Number[]

Además, se puede poner un int en un float[], pero Java A continuación, emitir el int en un flotador. A la inversa, también es posible, pero se perderá precisión. (editar: incluso desde la precisión int-> float se puede perder. float-> int puede perder información sobre la magnitud general del valor).

La conclusión dependerá de la pregunta. Para los tipos de datos primitivos, una matriz no puede contener el otro tipo de datos. Si usa una matriz de Objetos (Entero, Flotante, Número) la respuesta sería sí.

+5

Estrictamente hablando, ** no puede ** poner un 'int' en un' float [] '. Los valores que se almacenan en un 'float []' son ** siempre ** 'float' values. Además: la conversión de un 'int' a un' float' no siempre es sin pérdida. –

+0

Gracias por su respuesta, pero solo para ser claro: su conclusión sería 'sí'? – Samuel

+0

Mi conclusión sería 'sí pero'. Depende fuertemente de cómo se formuló la pregunta. Cuando usa una primitiva no puede contener el otro tipo, no puede obtener el otro tipo de ella, pero puede poner el otro tipo en ella. Así que estrictamente speeking la respuesta es no para los tipos de datos primitivos. Para Objetos (Entero, Flotante, Número) la respuesta sería sí. – Dorus

1

Si desea utilizar una matriz primitiva, se puede utilizar un double[] como double puede almacenar todas las posibles int y float valores. La única información que se pierde es si el número era originalmente una int o una float (hay 33 millones de números enteros que pueden ser o bien)

Para almacenar una int o float en un doble []

double[] d = 
int i = 
float f = 
d[0] = i; 
d[1] = f; 

Para recuperar un valor int o float.

int i = (int) d[0]; 
float f = (float) d[1]; 

Si utiliza un Objeto [] para almacenar cualquier combinación de Objetos, incluidos Entero y Flotante.

Las preguntas de la entrevista pueden atrapar a los entrevistados haciéndoles preguntas que nunca han pensado, generalmente porque no había una buena razón para hacerlo (posiblemente) Si la pregunta suena extraña, quizás debería. ;)

+0

Pero si almaceno los números en una matriz de dobles, la matriz solo contendrá números de punto flotante, ¿no? :) – Samuel

+0

@Samuel, 'int',' float' y 'double' son todos los bits de datos. Puedes hacer que signifiquen lo que quieras. ;) Para obtener un 'int' puedes hacer' (int) array [n] 'para obtener un' float' puedes hacer '(float) array [n]' –

+1

Estoy totalmente de acuerdo en que todo se reduce a dos montón de unos y ceros, pero supongo que apuntan a la presentación de nivel superior: p – Samuel

0

En java solo hay dos tipos de datos: objetos (todo lo que amplía el objeto de clase) y primitivas (int, byte, char, etc.). Además, cada primitiva tiene su hermano de objeto, por ejemplo, int y java.lang.Entero

Técnicamente, la matriz puede contener solo objetos.

Pero en Java 5.0 es posible saltar-primitivos a objetos de conversión gracias a 'autoboxing' funciones -, básicamente, que está reemplazando cada llamada como
int myInt = 0; array[0] = myInt;
con
array[0] = new Integer(myInt);

Esta sustitución se realiza de forma automática, sin embargo internamente (en tiempo de ejecución) java machine tendrá una matriz con objetos (Entero), no con primitivas (int), y esto puede afectar el rendimiento de las operaciones de la matriz.

2

Esta no es una pregunta que tenga una respuesta clara de "sí" o "no".

puedo ver tres formas distintas en las que la pregunta puede responderse afirmativamente:

  1. la matriz podría ser de tipo Number[] y podría contener (referencias a) Float y Integer objetos;
  2. la matriz podría ser de tipo double[] y podría contener float s y int s fundido a double (N.B. ambos moldes son sin pérdidas);
  3. la matriz podría ser de tipo int[] y podría almacenar int s as-como y float s convertido a int usando Float.floatToRawIntBits.

En el caso 3 (y podría decirse que en el caso 2) también necesitaría una matriz en paralelo que registraría el tipo del valor almacenado en cada elemento de la matriz principal. Dependiendo de los supuestos incluidos en la pregunta, esto puede descalificarlos como respuestas adecuadas.

Si surgiera esta pregunta en una entrevista, esbozaría las posibilidades para el entrevistador y le preguntaría cuál de las tres interpretaciones, si las hubiera, estaban buscando. Si es necesario, entonces elaboraré más.

+0

2) int para flotar también es sin pérdidas. 2 + 3) usted pierde la información de que el valor original era un int o un float. En el caso 3, esta información también fue muy importante. Todavía +1 para la opinión inteligente. – Dorus

+0

@Dorus: Muy buena información sobre el tipo de punto, gracias. He actualizado la respuesta. En cuanto a la conversión directa de tipo 'int'->' flotación ', esto es con pérdida, ya que 'float' solo tiene 23 bits para la mantisa, mientras que' int' puede requerir 31 bits. – NPE

+0

Cierto, tuve que leer rápidamente la Ampliación de la conversión primitiva. int to float puede perder precisión al igual que float to int does. – Dorus

Cuestiones relacionadas