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.
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
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.
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:
Mueva cada elemento hacia arriba uno, luego configure el último elemento en nulo.
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).
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.
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
Respuestas:
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
fuente
ArrayList
es O (n).ArrayList
, pero no paraLinkedList
.Arrays.copyOfRange()
es para API9 +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.
fuente
Arrays.copyOfRange()
es.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:
Puede utilizar
System.arraycopy
para 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
LinkedList
lugar. Puede utilizarLinkedList.remove
, que es de laQueue
interfaz, para su comodidad. ConLinkedList
, eliminar el primer elemento es O (1). De hecho, eliminar cualquier elemento es O (1) una vez que tenga unaListIterator
posición en esa posición. Sin embargo, acceder a un elemento arbitrario por índice es O (n).fuente
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.fuente
En resumen, el método de lista enlazada rápida:
List<String> llist = new LinkedList<String>(Arrays.asList(oldArray)); llist.remove(0);
fuente
Un método feo alternativo:
String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"}; String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");
fuente