2010-01-07 36 views
14

I tiene una matriz de enteros en Java que se inicializa como sigue:Inicialización matriz de tamaño variable en Java

public int MyNumbers[] = {0,0,0,0}; 

me gustaría, sin embargo, inicializar la matriz a un número de longitud variable de ceros.

private int number_of_elements = 4; 
public int MyNumbers[] = {0} * number_of_elements; // ???? 

No tengo idea de cómo ser nuevo en Java viene de C. ¿Alguna sugerencia?

EDITAR

Sé que podría utilizar un bucle for, pero la esperanza de que hubiera una manera sencilla de hacerlo.

Respuesta

31
int[] myNumbers = new int[size]; 
Arrays.fill(myNumbers, 0); 

ver http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html

+0

¡Gracias, amigo! ¿Estoy en lo cierto al suponer que la línea de importación es solo 'java.util.Arrays'? – daveslab

+0

Sí. Una cosa a tener en cuenta, sin embargo, es que de acuerdo con la fuente de Arrays.java (JDK 6) la función anterior efectivamente utiliza un ciclo for. Pero un día podría cambiar fácilmente ese comportamiento para usar algo de un nivel más bajo, como un memset (a través de JNI). – laginimaineb

+0

Confío en que la JVM reemplazará este código con el código faaaaaast.Por lo general, los bucles son desenrollados por la JVM, incluso ella lo optimizó para un memset. En Java, ¡nunca optimice a nivel de código! – akuhn

5
int[] MyNumbers = new int[number_of_elements]; 
+1

Creo que el cero en el código de ejemplo se entiende como un ejemplo, mientras que este one-liner creará la matriz llena de ceros, todavía no permite que el OP lo llene con otro valor arbitrario. – laginimaineb

5

Como alternativa puede usar ArrayList de modo que usted no tiene que preocuparse por el tamaño de antemano. Expandirá dinámicamente la matriz interna siempre que sea necesario.

List<Integer> numbers = new ArrayList<Integer>(); 
numbers.add(0); 
numbers.add(2); 
// ... 

Here's a tutorial para aprender más acerca de la API de colecciones, que es parte de ArrayList.

+1

+1 Para el uso de ArrayList. Eso es exactamente lo que estaba pensando que debería hacer. –

+0

+1 "Prefiere listas sobre matrices" – helpermethod

2
int[] MyNumbers = new int[number_of_elements]; 

Dado que este es un conjunto de int los elementos de la matriz obtendrá el valor predeterminado para la int en Java de 0 automáticamente.

Si se tratara de una matriz de objetos Integer, entonces tendría que completar la matriz después de crearla, ya que el valor predeterminado para una referencia de objeto es null. Para establecer los valores por defecto en una matriz Object puede hacer lo siguiente:

Integer[] MyNumbers = new Integer[number_of_elements]; 
java.util.Arrays.fill(MyNumbers, new Integer(0)); 

La misma técnica se podría utilizar, por supuesto, para inicializar la matriz int un valor distinto de cero, así:

int[] MyNumbers = new int[number_of_elements]; 
java.util.Arrays.fill(MyNumbers, 1); 
+2

nitpick: cuando llenes la matriz Integer, probablemente deberías usar 'Integer.valueOf()' en lugar de 'new Integer()' ya que eso hará uso de la caché Integer (ver http : //tech.puredanger.com/2007/02/01/valueof/ para una lectura interesante) – laginimaineb

0

Si estás buscando algo similar a Memset en C, no creo que exista. La implementación de Arrays.fill parece ser lo mismo que un ciclo for si observa Javadoc.

Sin embargo, me encontré con este artículo que discute la misma pregunta http://www.searchenginecaffe.com/2007/03/how-to-quickly-reset-value-of-java.html Parece que el uso de System.arraycopy es la solución mejor y esta es la función que puede utilizar (copiado del enlace)

public static void bytefill(byte[] array, byte value) { 
int len = array.length; 
if (len > 0) 
array[0] = value; 
    for (int i = 1; i < len; i += i) { 
    System.arraycopy(array, 0, array, i, ((len - i) < i) ? (len - i) : i); 
} 
} 
Cuestiones relacionadas