2010-09-08 11 views

Respuesta

106

El tamaño de las matrices en Java no se puede cambiar. Entonces, técnicamente no puedes eliminar ningún elemento de la matriz.

Una forma de simular la eliminación de un elemento de la matriz es crear una nueva matriz más pequeña y luego copiar todos los elementos de la matriz original en la nueva matriz más pequeña.

String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length); 

Sin embargo, yo no recomendaría el método anterior. Realmente deberías estar usando un List<String>. Las listas le permiten agregar y eliminar elementos de cualquier índice. Eso sería similar a lo siguiente:

List<String> list = new ArrayList<String>(); // or LinkedList<String>(); 
list.add("Stuff"); 
// add lots of stuff 
list.remove(0); // removes the first item 
+24

Es importante tener en cuenta que eliminar el primer elemento de una 'ArrayList' es O (n). –

+1

@Matt, para una matriz y la lista. Pero, el código es mucho más fácil para la lista. – jjnguy

+13

Para una matriz y una 'ArrayList', pero no para' LinkedList'. –

13

La forma más simple es, probablemente, la siguiente: básicamente, necesita construir una nueva matriz que sea un elemento más pequeño, luego copie los elementos que desea mantener en las posiciones correctas.

int n=oldArray.length-1; 
String[] newArray=new String[n]; 
System.arraycopy(oldArray,1,newArray,0,n); 

Tenga en cuenta que si usted se encuentra haciendo este tipo de operación con frecuencia, podría ser una señal de que en realidad se debe utilizar un tipo diferente de estructura de datos, por ejemplo, una lista vinculada Construir una nueva matriz cada vez es una operación O (n), que podría ser costosa si la matriz es grande. Una lista enlazada te da O (1) eliminación del primer elemento.

Una idea alternativa no es eliminar el primer elemento en absoluto, sino simplemente incrementar un entero que apunte al primer índice que está en uso. Los usuarios de la matriz deberán tener en cuenta esta compensación, pero este puede ser un enfoque eficiente. La clase Java String realmente usa este método internamente cuando crea subcadenas.

+4

Esto no es técnicamente la manera más fácil. 'Arrays.copyOfRange()' es. – jjnguy

+4

Dado que está usando Java6, puede usar Arrays.copyOfRange – Thilo

+1

@Justin más compacto - seguro, pero solo si está apuntando a Java 1.6 o superior – mikera

4

No puede hacerlo, mucho menos rápidamente. Las matrices en Java son de tamaño fijo. Dos cosas que podría hacer son:

  1. Cambie cada elemento hasta uno, luego configure el último elemento como nulo.
  2. Crea una nueva matriz, luego cópiala.

Puede usar System.arraycopy para cualquiera de estos. Ambos son O (n), ya que copian todos menos 1 elemento.

Si va a eliminar el primer elemento a menudo, considere usar LinkedList en su lugar. Puede usar LinkedList.remove, que es de la interfaz Queue, para mayor comodidad. Con LinkedList, eliminar el primer elemento es O (1). De hecho, eliminar cualquier elemento es O (1) una vez que tiene un ListIterator en esa posición. Sin embargo, acceder a un elemento arbitrario por índice es O (n).

2

Mantenga un índice del primer elemento "activo" de la matriz. Al eliminar (pretender eliminar) el primer elemento, se convierte en una operación de complejidad de tiempo O(1).

-3

Un método alternativo fea: [? ¿Cómo se quita objetos de una matriz en java]

String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"}; 
    String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", "); 
+2

Por favor, alguien con suficiente reputación rechazó esta respuesta, es exactamente lo que dice, ¡fea! No hay intención de ser grosero, pero en aras de la codecibilidad, ¡por favor no publique este tipo de cosas! – Penn

+0

si ya está usando matrices, sería mejor usar Arrays.copyOfRange –

Cuestiones relacionadas