2010-11-17 153 views
34

Aparte de recorrer cada elemento de una matriz y configurar cada uno como 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)?Vaciar una matriz en Java/procesamiento

+0

¿Qué tipo de matriz? – Adam

+0

algo como esto - 'float [] xco = new float [1024];' – ina

+1

Java está diseñado para que no tenga que preocuparse 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 hacer una diferencia, se pueden refactorizar fácilmente, por lo que no es necesario. –

Respuesta

20

Simplemente puede asignar null a la referencia. (Esto funciona para cualquier tipo de matriz, no sólo ints)

int[] arr = new int[]{1, 2, 3, 4}; 
arr = null; 

Esta voluntad 'clara a cabo' la matriz. También puede asignar una nueva matriz para que la referencia si quieres:

int[] arr = new int[]{1, 2, 3, 4}; 
arr = new int[]{6, 7, 8, 9}; 

Si usted está preocupado por las pérdidas de memoria, no se. 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 con el valor por defecto para el flotador.

+1

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 iteración, por lo que se puede vaciar. – ina

+1

no es tan seguro ya que romperá todas las partes del código que usa esa matriz y arrojará una 'NullPointerException' – Jack

+2

@ina, si asigna 'null' a la matriz, ya no podrá usarla. Deberá volver a declarar una matriz en esa referencia. Ver mi segundo ejemplo. – jjnguy

56

Hay

Arrays.fill(myArray, null); 

No es que lo hace algo diferente de lo que uno hace en su propia (que acaba de bucle a través de cada elemento y lo establece en null). No es nativo, ya que es el código puro de Java el que realiza esto, pero es una función de biblioteca, si tal vez eso es lo que quería decir.

Por supuesto, esto no le permite cambiar el tamaño de la matriz (a cero), si eso es lo que entiende por "vacío". Los tamaños de matriz son fijos, por lo que si desea que la matriz "nueva" tenga diferentes dimensiones, lo mejor es que reasigne la referencia a una nueva matriz, como lo demuestran las otras respuestas. Mejor aún, use un tipo List como un ArrayList que puede tener un tamaño variable.

+0

No hay ninguna razón para recorrer una matriz y 'null' cada entrada. ¿Qué ganas cuando haces esto simplemente por reasignar un nuevo valor a la matriz? (Perdón por el comentario sobre la respuesta anterior). – jjnguy

+0

@jjnguy: Pude ver una implementación de una lista de arreglos haciendo esto para la operación clara. –

+0

En lugar de simplemente hacer 'backingStore = new Type [size]'? – jjnguy

6
array = new String[array.length]; 
1

Solo quiero agregar algo al comentario de Mark. Si desea reutilizar la matriz sin asignación adicional, simplemente úsela nuevamente y anule los valores existentes con valores nuevos. Funcionará si llena la matriz secuencialmente. En este caso, solo recuerde el último elemento inicializado y use array hasta este índice. No importa que haya algo de basura al final de la matriz.

+0

Esto es exactamente lo que' ArrayList' hace por usted detrás de las escenas. Funciona para hacerlo usted mismo, pero es más engorroso y fácil de cometer errores. IMO, mejor usar una clase 'Collection'.Pero si tiene que usar una matriz directamente, esta es una buena observación. –

2

El borrado más rápido que Arrays.fill es con esto (desde Fast Serialization Lib).Sólo tiene que utilizar 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); 
} 
-8

Crear matriz:

ArrayList<String> User = new ArrayList<String>(); 

Esta matriz se puede borrar

User.clear(); 
+6

Esto no es una matriz ... esta es una ArrayList que es una implementación de la Lista. – Shadi

0

Tome doble matriz como un ejemplo, si la matriz de entrada inicial values es no vacia, el siguiente fragmento de código es superior al directo tradicional for-loop en comp. lexity:

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

yo era capaz de hacer eso con las 2 líneas siguientes, que tenía una matriz llamada selected_items utilizados para obtener todos los elementos seleccionados en un dataTable

selected_items = null; selected_items = [];