Mam tablicę ciągów ( String[]) i muszę usunąć pierwszą pozycję. Jak mogę to zrobić skutecznie?
Mam tablicę ciągów ( String[]) i muszę usunąć pierwszą pozycję. Jak mogę to zrobić skutecznie?
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
ArrayListto O (n).
ArrayList, ale nie dla LinkedList.
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.
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.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).
Alternatywna brzydka metoda:
String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");