Ho string array ( String[]) e devo rimuovere il primo elemento. Come posso farlo in modo efficiente?
Ho string array ( String[]) e devo rimuovere il primo elemento. Come posso farlo in modo efficiente?
Risposte:
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
ArrayListè O (n).
ArrayList, ma non per LinkedList.
Arrays.copyOfRange()è per API9 +
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.
Arrays.copyOfRange()è.
Non puoi farlo affatto, figuriamoci velocemente. Gli array in Java sono di dimensioni fisse. Due cose che potresti fare sono:
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).
Un brutto metodo alternativo:
String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");