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.
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
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.
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:
Przesuń każdy element o jeden w górę, a następnie ustaw ostatni element na null.
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).
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.
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
Odpowiedzi:
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
źródło
ArrayList
to O (n).ArrayList
, ale nie dlaLinkedList
.Arrays.copyOfRange()
jest dla API9 +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.
źródło
Arrays.copyOfRange()
jest.W ogóle nie możesz tego zrobić, a co dopiero szybko. Tablice w Javie mają stały rozmiar. Możesz zrobić dwie rzeczy:
Możesz użyć
System.arraycopy
do 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
LinkedList
zamiast tego. Możesz użyćLinkedList.remove
, który jest zQueue
interfejsu, dla wygody. PoLinkedList
usunięciu pierwszego elementu jest O (1). W rzeczywistości usunięcie dowolnego elementu jest O (1), gdy maszListIterator
do tej pozycji. Jednak dostęp do dowolnego elementu za pomocą indeksu to O (n).źródło
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.źródło
Podsumowując, metoda quick linkedlist:
List<String> llist = new LinkedList<String>(Arrays.asList(oldArray)); llist.remove(0);
źródło
Alternatywna brzydka metoda:
String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"}; String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");
źródło