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

86

Mam tablicę ciągów ( String[]) i muszę usunąć pierwszą pozycję. Jak mogę to zrobić skutecznie?

NullVoxPopuli
źródło
możliwy duplikat Jak usunąć obiekty z tablicy w Javie?
McDowell
4
Nie naśladownictwo. Poprzednie pytanie dotyczy usuwania pozycji według wartości; chodzi o usuwanie pozycji według indeksu.
james.garriss

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
jjnguy
źródło
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.

mikera
źródło
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).

Matthew Flaschen
źródło
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.

msw
źródło
0

Podsumowując, metoda quick linkedlist:

List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);
mjad-org
źródło
-8

Alternatywna brzydka metoda:

   String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
   String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");
Emil
źródło
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