Ik heb een stringarray (String[]
) en ik moet het eerste item verwijderen. Hoe kan ik dat efficiënt doen?
Antwoord 1, autoriteit 100%
De grootte van arrays in Java kan niet worden gewijzigd. Technisch gezien kun je dus geen elementen uit de array verwijderen.
Een manier om het verwijderen van een element uit de array te simuleren, is door een nieuwe, kleinere array te maken en vervolgens alle elementen van de originele array naar de nieuwe, kleinere array te kopiëren.
String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length);
Echterzou ik de bovenstaande methode niet aanraden. Je zou eigenlijk een List<String>
moeten gebruiken. Met lijsten kunt u items toevoegen aan en verwijderen uit elke index. Dat zou er ongeveer als volgt uitzien:
List<String> list = new ArrayList<String>(); // or LinkedList<String>();
list.add("Stuff");
// add lots of stuff
list.remove(0); // removes the first item
Antwoord 2, autoriteit 9%
De eenvoudigste manier is waarschijnlijk als volgt: u moet in feite een nieuwe array maken die één element kleiner is, en vervolgens de elementen die u wilt behouden naar de juiste posities kopiëren.
int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);
Houd er rekening mee dat als u merkt dat u dit soort bewerkingen vaak uitvoert, dit een teken kan zijn dat u eigenlijk een ander soort gegevensstructuur zou moeten gebruiken, b.v. een gekoppelde lijst. Elke keer een nieuwe array construeren is een O(n)-bewerking, die duur kan worden als uw array groot is. Een gelinkte lijst zou je O(1) verwijdering van het eerste element opleveren.
Een alternatief idee is om het eerste item helemaal niet te verwijderen, maar gewoon een geheel getal te verhogen dat verwijst naar de eerste index die in gebruik is. Gebruikers van de array zullen rekening moeten houden met deze offset, maar dit kan een efficiënte benadering zijn. De klasse Java String gebruikt deze methode intern bij het maken van substrings.
Antwoord 3, autoriteit 3%
Je kunt het helemaal niet, laat staan snel. Arrays in Java hebben een vaste grootte. U kunt twee dingen doen:
- Schuif elk element één omhoog en zet het laatste element op nul.
- Maak een nieuwe array en kopieer deze.
Je kunt System.arraycopy
voor beide gebruiken. Beide zijn O(n), aangezien ze op één na alle elementen kopiëren.
Als je het eerste element vaak gaat verwijderen, overweeg dan om LinkedList
in plaats daarvan. U kunt LinkedList.remove
, dat voor het gemak uit de Queue
-interface komt. Met LinkedList
is het verwijderen van het eerste element O(1). In feite is het verwijderen van een element O(1) als je eenmaal een ListIterator
op die positie hebt. Toegang tot een willekeurig element via index is echter O(n).
Antwoord 4, autoriteit 2%
Houd een index bij van het eerste “live” element van de array. Het verwijderen (doen alsof het verwijderen) van het eerste element wordt dan een O(1)
tijdcomplexiteitsbewerking.
Antwoord 5
Samenvattend, de snelle gekoppelde lijstmethode:
List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);
Antwoord 6
Een alternatieve lelijke methode:
String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");