2010-09-08 24 views
59

Ho un array di stringhe (String[]) e devo rimuovere il primo elemento. Come posso farlo in modo efficiente?Qual è il modo migliore per rimuovere il primo elemento da un array?

+0

possibile duplicato (http://stackoverflow.com/questions/112503/how-do-i- remove-objects-from-an-array-in-java) – McDowell

+2

Non un dupe.La domanda precedente riguarda la rimozione degli articoli in base al valore; si tratta di rimuovere un oggetto per indice. –

risposta

106

La dimensione degli array in Java non può essere modificata. Quindi, tecnicamente non puoi 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 vorrei suggerire il metodo di cui sopra. Dovresti davvero usare uno List<String>. Le liste 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 
+24

È importante notare che la rimozione del primo elemento di un 'ArrayList' è O (n). –

+1

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

+13

Per un array e un 'ArrayList', ma non per' LinkedList'. –

13

Il modo più semplice è probabilmente il seguente: è fondamentalmente necessario costruire un nuovo array con 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 vi trovate a fare questo tipo di operazione di frequente, potrebbe essere un segno che si dovrebbe effettivamente utilizzare un diverso tipo di struttura dati, per esempio una lista collegata. La costruzione di un nuovo array ogni volta è un'operazione O (n), che può diventare costosa se l'array è di grandi dimensioni. Una lista concatenata ti darebbe O (1) rimozione del primo elemento.

Un'idea alternativa non è quella di rimuovere il primo elemento, ma solo di incrementare un numero intero che punta al primo indice che è 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

Poiché sta utilizzando Java6, può utilizzare Arrays.copyOfRange più compatto – Thilo

+1

@Justin, ma solo se si sta utilizzando Java 1.6 o superiore a – mikera

4

Non puoi farlo affatto, figuriamoci in fretta. Le matrici in Java sono di dimensioni fisse. Due cose che potresti fare sono:

  1. Sposta ogni elemento verso l'alto, quindi imposta l'ultimo elemento su null.
  2. Creare un nuovo array, quindi copiarlo.

È possibile utilizzare System.arraycopy per uno di questi. Entrambi sono O (n), poiché copiano tutti tranne 1 elemento.

Se si rimuoverà spesso il primo elemento, prendere in considerazione l'utilizzo di LinkedList. È possibile utilizzare LinkedList.remove, che è dall'interfaccia Queue, per comodità. Con LinkedList, la rimozione del primo elemento è O (1). In realtà, la rimozione di qualsiasi elemento è O (1) quando si dispone di un ListIterator in quella posizione. Tuttavia, l'accesso a un elemento arbitrario per indice è O (n).

2

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

-3

Un brutto metodo alternativo: [? Come faccio a rimuovere gli oggetti da un array in Java]

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 invertire questa risposta - è esattamente quello che dice che è - brutto! Nessuna intenzione di essere scortese, ma nell'interesse della codificabilità, non pubblicare questo tipo di cose! – Penn

+0

se stai già usando gli array, sarebbe meglio usare Arrays.copyOfRange –

Problemi correlati