Jaki jest najlepszy sposób usunięcia pierwszego elementu z tablicy?


Odpowiedzi:


154

Nie można zmienić rozmiaru tablic w Javie. Więc technicznie nie można usunąć żadnych elementów z tablicy.

Jednym ze sposobów symulacji usuwania elementu z tablicy jest utworzenie nowej, mniejszej tablicy, a następnie skopiowanie wszystkich elementów z oryginalnej tablicy do nowej, mniejszej tablicy.

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

Nie sugerowałbym jednak powyższej metody. Naprawdę powinieneś używać List<String>. Listy umożliwiają dodawanie i usuwanie elementów z dowolnego indeksu. Wyglądałoby to podobnie do następującego:

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

32
Należy zauważyć, że usunięcie pierwszego elementu an ArrayListto O (n).
Matthew Flaschen,

1
@Matt, dla tablicy i listy. Ale kod jest znacznie łatwiejszy dla listy.
jjnguy

16
Dla tablicy i an ArrayList, ale nie dla LinkedList.
Matthew Flaschen

4
O (n)? no cóż… w tablicy C? aby usunąć pierwszy element, wystarczy zwiększyć wskaźnik O (1)
Hernán Eche

2
Dla tych, którzy używają Java na Androida, takich jak ja, Arrays.copyOfRange()jest dla API9 +
Sdghasemi

14

Najprostszy sposób jest prawdopodobnie następujący - w zasadzie musisz skonstruować nową tablicę, która jest o jeden element mniejsza, a następnie skopiować elementy, które chcesz zachować, do właściwych pozycji.

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

Zwróć uwagę, że jeśli często wykonujesz tego rodzaju operacje, może to oznaczać, że powinieneś używać innego rodzaju struktury danych, np. Listy połączonej. Konstruowanie nowej tablicy za każdym razem jest operacją O (n), która może być kosztowna, jeśli tablica jest duża. Lista połączona daje O (1) usunięcie pierwszego elementu.

Alternatywnym pomysłem jest nie usuwanie pierwszego elementu, ale po prostu zwiększenie liczby całkowitej wskazującej na pierwszy używany indeks. Użytkownicy macierzy będą musieli wziąć pod uwagę to przesunięcie, ale może to być wydajne podejście. Klasa String języka Java w rzeczywistości używa tej metody wewnętrznie podczas tworzenia podciągów.


4
Nie jest to technicznie najłatwiejszy sposób. Arrays.copyOfRange()jest.
jjnguy

4
Ponieważ używa Java6, może używać bardziej kompaktowych Arrays.copyOfRange
Thilo

1
@Justin - jasne, ale tylko jeśli celujesz w Javę 1.6 lub
nowszą

1
prawdziwe. Nie zawsze ma to zastosowanie.
jjnguy

6
z tytułu pytania jasno wynika, że ​​PO jest zainteresowany odpowiedziami dla języka Java 1.6 i nowszych.
Stephen C

5

W ogóle nie możesz tego zrobić, a co dopiero szybko. Tablice w Javie mają stały rozmiar. Możesz zrobić dwie rzeczy:

  1. Przesuń każdy element o jeden w górę, a następnie ustaw ostatni element na null.
  2. Utwórz nową tablicę, a następnie skopiuj ją.

Możesz użyć System.arraycopydo jednego z nich. Oba są O (n), ponieważ kopiują wszystkie elementy oprócz 1.

Jeśli będziesz często usuwać pierwszy element, rozważ użycie LinkedListzamiast tego. Możesz użyć LinkedList.remove, który jest z Queueinterfejsu, dla wygody. Po LinkedListusunięciu pierwszego elementu jest O (1). W rzeczywistości usunięcie dowolnego elementu jest O (1), gdy masz ListIteratordo tej pozycji. Jednak dostęp do dowolnego elementu za pomocą indeksu to O (n).


2

Zachowaj indeks pierwszego „aktywnego” elementu tablicy. Usunięcie (udawanie usunięcia) pierwszego elementu staje się O(1)wówczas operacją złożoności czasowej.


0

Podsumowując, metoda quick linkedlist:

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

-8

Alternatywna brzydka metoda:

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

2
Proszę, ktoś, kto ma wystarczającą reputację, przegłosuj tę odpowiedź - dokładnie tak, jak mówi - brzydka! Nie mam zamiaru być niegrzeczny, ale ze względu na możliwość kodowania nie publikuj takich rzeczy!
Hack5,

jeśli używasz już tablic, lepiej byłoby użyć Arrays.copyOfRange
Bishal Gautam

Poprosił o najlepszy sposób.
Sapphire_Brick

usuń go i zobacz, ile zyskasz reputacji.
Sapphire_Brick
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.