Vaciar una matriz en Java / procesamiento

6 minutos de lectura

avatar de usuario de ina
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)?

  • 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(); o myArray = 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


Avatar de usuario de Mark Peters
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 llamando fill(boolean[], boolean)no fill(Object[], Object)por lo que no aceptaría null para el segundo parámetro (como null no se puede asignar a boolean)

    – Mark Peters

    1 de octubre de 2015 a las 3:54


avatar de usuario de jjnguy
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 hacerlo null.

    – 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);
  }
}

Avatar de usuario de Suraj Mahli
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];

Avatar de usuario de R.Moeller
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);
}

avatar de usuario de om-nom-nom
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 un Collection 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

¿Ha sido útil esta solución?