en un
Además de recorrer cada elemento en una matriz y establecer cada uno en nulo, ¿hay una función nativa en Java / procesamiento para simplemente vaciar una matriz (o destruirla, para poder volver a declararla como una nueva matriz)?
Marcos Peters
hay
Arrays.fill(myArray, null);
No es que haga algo diferente de lo que haría por su cuenta (simplemente recorre cada elemento y lo establece en nulo). No es nativo en el sentido de que es código Java puro el que realiza esto, pero es una función de biblioteca si tal vez eso es lo que querías decir.
Esto, por supuesto, no le permite cambiar el tamaño la matriz (a cero), si eso es lo que quiso decir con “vacío”. Los tamaños de matriz son fijos, por lo que si desea que la “nueva” matriz tenga dimensiones diferentes, lo mejor es reasignar la referencia a una nueva matriz como lo demuestran las otras respuestas. Mejor aún, use un List
escribir como un ArrayList
que puede tener tamaño variable.
-
No hay razón para recorrer una matriz y
null
cada entrada. ¿Qué gana cuando hace esto en lugar de simplemente reasignar un nuevo valor a la matriz? (Perdón por el comentario sobre la respuesta anterior).– jjnguy
30 de agosto de 2012 a las 13:07
-
@jjnguy: Pude ver una implementación de una lista de arreglos haciendo esto para la operación de borrado.
– Mark Peters
31 de agosto de 2012 a las 18:35
-
En lugar de simplemente hacer
backingStore = new Type[size]
?– jjnguy
31 de agosto de 2012 a las 20:13
-
@jjnguy: Claro. Poner a cero la matriz es mucho más eficiente que crear una nueva (particularmente cuando el JLS requiere que la nueva matriz se ponga a cero de todos modos). De hecho, esto es exactamente lo que OpenJDK
ArrayList.clear()
hace: establece el tamaño en cero y luego itera sobre la matriz, poniendo a cero cada índice.– Mark Peters
1 de septiembre de 2012 a las 5:05
-
@IgorGanapolsky: Si tienes un
boolean[]
estarías llamandofill(boolean[], boolean)
nofill(Object[], Object)
por lo que no aceptaríanull
para el segundo parámetro (comonull
no se puede asignar aboolean
)– Mark Peters
1 de octubre de 2015 a las 3:54
jjnguy
Simplemente puede asignar null
a la referencia (Esto funcionará para cualquier tipo de matriz, no solo ints
)
int[] arr = new int[]{1, 2, 3, 4};
arr = null;
Esto ‘limpiará’ la matriz. También puede asignar una nueva matriz a esa referencia si lo desea:
int[] arr = new int[]{1, 2, 3, 4};
arr = new int[]{6, 7, 8, 9};
Si le preocupan las fugas de memoria, no lo haga. El recolector de basura limpiará las referencias dejadas por la matriz.
Otro ejemplo:
float[] arr = ;// some array that you want to clear
arr = new float[arr.length];
Esto creará un nuevo float[]
inicializado al valor predeterminado para float.
-
Obtengo el error nullpointerexception cuando simplemente vacío una matriz asignándola a nulo… la idea es que la misma matriz se reutilice en cada iteración, pero los números no importan después de cada una, por lo que se puede vaciar.
– en un
17 de noviembre de 2010 a las 20:10
-
no es tan seguro ya que romperá cada parte del código que usa esa matriz y lanzará un
NullPointerException
– Jacobo
17 de noviembre de 2010 a las 20:12
-
@ina, si asignas
null
a la matriz, ya no podrá usarla. Tendrá que volver a declarar una matriz en esa referencia. Ver mi segundo ejemplo.– jjnguy
17 de noviembre de 2010 a las 20:12
-
@ina, o vea mi tercer ejemplo.
– jjnguy
17 de noviembre de 2010 a las 20:14
-
he utilizado
arr = new int[]{};
para borrar mi matriz en lugar de hacerlonull
.– Senura Dissanayake
14 de abril de 2018 a las 5:37
array = new String[array.length];
-
¿Entonces esto se iniciará con todos los valores predeterminados correctos y en este caso son nulos? ¿Pero esto no aumentará las posibilidades de nullPointerException?
– Sr. Jain
17 de junio de 2020 a las 0:40
Tome la matriz doble como ejemplo, si la entrada inicial values
matriz es no vacíoel siguiente fragmento de código es superior al directo tradicional for-loop
en la complejidad del tiempo:
public static void resetValues(double[] values) {
int len = values.length;
if (len > 0) {
values[0] = 0.0;
}
for (int i = 1; i < len; i += i) {
System.arraycopy(values, 0, values, i, ((len - i) < i) ? (len - i) : i);
}
}
Suraj Mahli
Si matriz xco
no es definitivo, entonces una simple reasignación funcionaría:
es decir
xco = new Float[xco .length];
Esto supone que necesita la matriz xco
para quedar del mismo tamaño. Si eso no es necesario, cree una matriz vacía:
xco= new Float[0];
R. Moeller
Una limpieza más rápida que Arrays.fill es con esto (De Fast Serialization Lib). Solo uso arrayCopy (es nativo) para borrar la matriz:
static Object[] EmptyObjArray = new Object[10000];
public static void clear(Object[] arr) {
final int arrlen = arr.length;
clear(arr, arrlen);
}
public static void clear(Object[] arr, int arrlen) {
int count = 0;
final int length = EmptyObjArray.length;
while( arrlen - count > length) {
System.arraycopy(EmptyObjArray,0,arr,count, length);
count += length;
}
System.arraycopy(EmptyObjArray,0,arr,count, arrlen -count);
}
Om nom nom
Solo quiero agregar algo al comentario de Mark. Si desea reutilizar la matriz sin una asignación adicional, simplemente utilícela nuevamente y anule los valores existentes con otros nuevos. Funcionará si llena la matriz secuencialmente. En este caso, solo recuerde el último elemento inicializado y use la matriz hasta este índice. No importa que haya algo de basura al final de la matriz.
-
Esto es exactamente lo que
ArrayList
hace por ti detrás de escena. Funciona para hacerlo usted mismo, pero es más engorroso y fácil de cometer errores. OMI, mejor usar unCollection
clase. Pero si está atascado con el uso de una matriz directamente, esta es una buena observación.– Mark Peters
17 de noviembre de 2010 a las 21:04
algo como esto –
float[] xco=new float[1024];
– en un
17 de noviembre de 2010 a las 20:11
Java está diseñado para que no tengas que preocuparte por esto. Debería poder organizar su código para que no tenga que hacer nada. Para los pocos ejemplos en los que podría marcar la diferencia, se pueden refactorizar fácilmente para que no sea necesario.
– Peter Lawrey
17 de noviembre de 2010 a las 20:22
La pregunta aquí no está clara para mí. ¿Está preguntando 1) cómo configuro todos los elementos como nulos en una matriz o 2) cómo elimino todos los elementos de la matriz. Si los elementos de la matriz ya no se desean y lo que desea es una matriz vacía (es decir, una matriz con cero elementos) lista para usarse nuevamente, puede usar
myArray.clear();
omyArray = new ArrayList();
. Si desea que cada elemento de la matriz sea nulo para alguna necesidad específica en su código, esta no es una matriz vacía; es una matriz de valores nulos. Voté negativamente esta pregunta, pero votaré positivamente si aborda mi inquietud.– Jasón
22 mayo 2015 a las 15:48