Qual è il modo migliore per rimuovere il primo elemento da un array?


Risposte:


158

La dimensione degli array in Java non può essere modificata. Quindi, tecnicamente non è possibile rimuovere alcun elemento dall'array.

Un modo per simulare la rimozione di un elemento dall'array consiste nel creare un nuovo array più piccolo e quindi copiare tutti gli elementi dall'array originale nel nuovo array più piccolo.

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

Tuttavia , non suggerirei il metodo sopra. Dovresti davvero usare un file List<String>. Gli elenchi ti consentono di aggiungere e rimuovere elementi da qualsiasi indice. Sarebbe simile al seguente:

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

34
È importante notare che la rimozione del primo elemento di an ArrayListè O (n).
Matthew Flaschen

1
@ Matt, per un array e l'elenco. Ma il codice è molto più semplice per l'elenco.
jjnguy

16
Per un array e un ArrayList, ma non per LinkedList.
Matthew Flaschen

4
Sopra) ? beh .. in un array C? per rimuovere l'elemento pugno basta incrementare il puntatore O (1)
Hernán Eche

3
Per coloro che utilizzano Java per Android come me, Arrays.copyOfRange()è per API9 +
Sdghasemi

15

Il modo più semplice è probabilmente il seguente: fondamentalmente è necessario costruire un nuovo array di un elemento più piccolo, quindi copiare gli elementi che si desidera mantenere nelle posizioni corrette.

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

Nota che se ti ritrovi a fare questo tipo di operazione frequentemente, potrebbe essere un segno che dovresti effettivamente utilizzare un diverso tipo di struttura dati, ad esempio un elenco collegato. La costruzione di un nuovo array ogni volta è un'operazione O (n), che potrebbe diventare costosa se l'array è grande. Un elenco collegato ti darebbe O (1) rimozione del primo elemento.

Un'idea alternativa è non rimuovere affatto il primo elemento, ma semplicemente incrementare un numero intero che punta al primo indice in uso. Gli utenti dell'array dovranno tenere conto di questo offset, ma questo può essere un approccio efficiente. La classe Java String utilizza effettivamente questo metodo internamente durante la creazione di sottostringhe.


4
Questo non è tecnicamente il modo più semplice. Arrays.copyOfRange()è.
jjnguy

4
Dato che sta usando Java6, può usare il più compatto Arrays.copyOfRange
Thilo

1
@Justin - certo, ma solo se stai prendendo di mira Java 1.6 o superiore
mikera

1
vero. Non è sempre applicabile.
jjnguy

6
il titolo della domanda chiarisce che l'OP è interessato alle risposte per Java 1.6 e versioni successive.
Stephen C

5

Non puoi farlo affatto, figuriamoci velocemente. Gli array in Java sono di dimensioni fisse. Due cose che potresti fare sono:

  1. Sposta ogni elemento in alto di uno, quindi imposta l'ultimo elemento su null.
  2. Crea un nuovo array, quindi copialo.

Puoi usare System.arraycopyper uno di questi. Entrambi sono O (n), poiché copiano tutti gli elementi tranne 1.

Se rimuovi spesso il primo elemento, valuta la possibilità di utilizzarlo LinkedList. Puoi usare LinkedList.remove, che è Queuedall'interfaccia, per comodità. Con LinkedList, la rimozione del primo elemento è O (1). In effetti, la rimozione di qualsiasi elemento è O (1) una volta che hai a ListIteratorin quella posizione. Tuttavia, l'accesso a un elemento arbitrario tramite indice è O (n).


3

Mantieni un indice del primo elemento "live" dell'array. Rimuovere (fingere di rimuovere) il primo elemento diventa quindi un'operazione di O(1)complessità temporale.


0

Per riassumere, il metodo rapido della lista collegata:

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

-10

Un brutto metodo alternativo:

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

2
Per favore, qualcuno con una reputazione sufficiente ha negato questa risposta - è esattamente quello che dice che è - brutta! Nessuna intenzione di essere scortese, ma nell'interesse della codificabilità per favore non postare questo genere di cose!
Hack5

se stai già usando Arrays, sarebbe meglio usare Arrays.copyOfRange
Bishal Gautam

Ha chiesto il modo migliore .
Sapphire_Brick

cancellalo e guarda quanta reputazione guadagnerai.
Sapphire_Brick
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.