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

4 minutos de lectura

avatar de usuario
NullVoxPopuli

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

  • posible duplicado de ¿Cómo elimino objetos de una matriz en Java?

    – Mc Dowell

    9 de mayo de 2011 a las 10:28

  • No es un tonto. La pregunta anterior es sobre la eliminación de artículos por valor; se trata de eliminar un elemento por índice.

    – james.garriss

    26 de noviembre de 2013 a las 15:22

avatar de usuario
jjnguy

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í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

  • Es importante tener en cuenta que eliminar el primer elemento de un ArrayList Está encendido).

    – Mateo Flaschen

    8 de septiembre de 2010 a las 1:27


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

    – jjnguy

    8 de septiembre de 2010 a las 1:28

  • Para una matriz y un ArrayListpero no para LinkedList.

    – Mateo Flaschen

    8 de septiembre de 2010 a las 1:38

  • En) ? bueno… en una matriz C? para eliminar el primer elemento, simplemente puede incrementar el puntero O (1)

    – Hernán Eche

    30 mayo 2014 a las 20:16


  • Para aquellos que usan Java para Android como yo, Arrays.copyOfRange() es para API9+

    – Sdghasemi

    5 de julio de 2015 a las 9:51


avatar de usuario
mikera

La forma más simple es probablemente la siguiente: básicamente necesita construir una nueva matriz que sea un elemento más pequeña, 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 se encuentra realizando este tipo de operación con frecuencia, podría ser una señal de que en realidad debería estar utilizando un tipo diferente de estructura de datos, por ejemplo, una lista enlazada. Construir una matriz nueva cada vez es una operación O(n), que podría resultar costosa si la matriz es grande. Una lista enlazada le daría la eliminación O (1) 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 este desplazamiento, pero este puede ser un enfoque eficiente. La clase Java String en realidad usa este método internamente al crear subcadenas.

  • Esta no es técnicamente la forma más fácil. Arrays.copyOfRange() es.

    – jjnguy

    8 de septiembre de 2010 a las 1:21


  • Como está usando Java6, puede usar Arrays.copyOfRange más compacto

    – Thilo

    8 de septiembre de 2010 a las 1:21

  • @Justin: claro, pero solo si tiene como objetivo Java 1.6 o superior

    – Mikera

    8 de septiembre de 2010 a las 1:25

  • verdadero. No siempre es aplicable.

    – jjnguy

    8 de septiembre de 2010 a las 1:28

  • el título de la pregunta deja en claro que el OP es interesado en respuestas para Java 1.6 y superior.

    – Esteban C.

    8 de septiembre de 2010 a las 1:59

avatar de usuario
Mateo Flaschen

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

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

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

Si eliminará el primer elemento con frecuencia, considere usar LinkedList en cambio. Puedes usar LinkedList.removeque es de la Queue interfaz, para mayor comodidad. Con LinkedList, eliminando el primer elemento es O(1). De hecho, eliminar cualquier elemento es O(1) una vez que tienes un ListIterator a esa posición. Sin embargo, acceder a un elemento arbitrario por índice es O(n).

avatar de usuario
msw

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

avatar de usuario
mjad-org

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

List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);

  • La pregunta es sobre arreglos de Java, no sobre listas.

    – Malinda

    3 de mayo a las 0:03

avatar de usuario
emilio

Un método feo alternativo:

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

  • La pregunta es sobre arreglos de Java, no sobre listas.

    – Malinda

    3 de mayo a las 0:03

¿Ha sido útil esta solución?