¿Cuál es la mejor manera de eliminar el primer elemento de una matriz?

86

Tengo una matriz de cadenas ( String[]) y necesito eliminar el primer elemento. ¿Cómo puedo hacer eso de manera eficiente?

NullVoxPopuli
fuente
4
No es un engaño. La pregunta anterior trata sobre la eliminación de elementos por valor; se trata de eliminar un elemento por índice.
james.garriss

Respuestas:

154

El tamaño de las matrices en Java no se puede cambiar. Entonces, técnicamente no puede 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 , no sugeriría el método anterior. Realmente debería usar un List<String>. Las listas le permiten agregar y eliminar elementos de cualquier índice. Eso se verí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
jjnguy
fuente
32
Es importante tener en cuenta que eliminar el primer elemento de an ArrayListes O (n).
Matthew Flaschen
1
@Matt, para una matriz y la lista. Pero el código es mucho más fácil para la lista.
jjnguy
16
Para una matriz y una ArrayList, pero no para LinkedList.
Matthew Flaschen
4
En) ? bueno .. en una matriz de C? para eliminar el primer elemento puede incrementar el puntero O (1)
Hernán Eche
2
Para aquellos que usan Java para Android como yo, Arrays.copyOfRange()es para API9 +
Sdghasemi
14

La forma más sencilla es probablemente la siguiente: básicamente necesita construir una nueva matriz que sea un elemento más pequeña, luego copiar 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 se encuentra realizando este tipo de operaciones con frecuencia, podría ser una señal de que debería estar utilizando un tipo diferente de estructura de datos, por ejemplo, una lista enlazada. Construir una nueva matriz cada vez es una operación O (n), que podría resultar costosa si su matriz es grande. Una lista enlazada le daría O (1) eliminación del primer elemento.

Una idea alternativa es no eliminar el primer elemento en absoluto, sino simplemente incrementar un número 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 eficaz. La clase Java String realmente utiliza este método internamente al crear subcadenas.

mikera
fuente
4
Técnicamente, esta no es la forma más sencilla. Arrays.copyOfRange()es.
jjnguy
4
Como está usando Java6, puede usar Arrays.copyOfRange más compacto
Thilo
1
@Justin - seguro, pero solo si su objetivo es Java 1.6 o superior
mikera
1
cierto. No siempre es aplicable.
jjnguy
6
el título de la pregunta deja en claro que el OP está interesado en respuestas para Java 1.6 y superior.
Stephen C
5

No puedes hacerlo en absoluto, y mucho menos rápido. Las matrices en Java son de tamaño fijo. Dos cosas que puedes hacer son:

  1. Mueva cada elemento hacia arriba uno, luego configure el último elemento en nulo.
  2. Cree una nueva matriz y luego cópiela.

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

Si va a eliminar el primer elemento con frecuencia, considere usarlo en su LinkedListlugar. Puede utilizar LinkedList.remove, que es de la Queueinterfaz, para su comodidad. Con LinkedList, eliminar el primer elemento es O (1). De hecho, eliminar cualquier elemento es O (1) una vez que tenga una ListIteratorposición en esa posición. Sin embargo, acceder a un elemento arbitrario por índice es O (n).

Matthew Flaschen
fuente
2

Mantenga un índice del primer elemento "en vivo" de la matriz. Eliminar (pretender eliminar) el primer elemento se convierte en una O(1)operación de complejidad temporal.

msw
fuente
0

En resumen, el método de lista enlazada rápida:

List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);
mjad-org
fuente
-8

Un método feo alternativo:

   String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
   String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");
Emil
fuente
2
Por favor, alguien con suficiente reputación rechace esta respuesta; es exactamente lo que dice: ¡fea! Sin intención de ser grosero, pero en aras de la codificación, ¡no publique este tipo de cosas!
Hack5
si ya está usando Arrays, sería mejor usar Arrays.copyOfRange
Bishal Gautam
Preguntó por la mejor manera.
Sapphire_Brick
elimínelo y vea cuánta reputación obtendrá.
Sapphire_Brick