„Rishi, naprawdę nie mogę się doczekać poznania pozostałych metod klasy Arrays.

„Taki zapał do nauki nie może nie zadowolić twojego starego nauczyciela! Ale jeśli naprawdę chcesz dowiedzieć się wszystkiego, życzliwy czarodziej o imieniu Google pomoże ci dzień i noc”.

"Uhm..."

"Żartuję. Niby. Oczywiście wszystko lepiej wytłumaczę, ale jak coś wypadnie - pamiętaj o dobrym czarodzieju. Dzisiejszą lekcję zacznę od Arrays.fillmetody

„Pracując z tablicami, programiści Java bardzo często muszą wypełnić tablicę tą samą wartością. Można oczywiście napisać pętlę i po prostu przypisać jakąś wartość do każdej komórki tablicy w pętli:

int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;

„Lub zamiast tego wszystkiego możesz wywołać metodę Arrays.fill(), która robi dokładnie to samo: wypełnia przekazaną tablicę przekazaną wartością. Oto jak to wygląda:

Arrays.fill(name, value)

A kod z powyższego przykładu można uczynić nieco bardziej zwartym i bardziej przejrzystym:

int[] x = new int[100];
Arrays.fill(x, 999);

"Piękny!"

„Możesz również użyć tej Arrays.fill()metody, aby wypełnić nie całą tablicę, ale jej część pewną wartością:

Arrays.fill(name, first, last, value)

„Gdzie pierwszy i ostatni to indeksy pierwszej i ostatniej komórki do wypełnienia.

Zgodnie ze starą dobrą (lub złą) tradycją Javy pamiętaj, że ostatni element nie mieści się w zakresie.

Przykład:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Arrays.fill(x, 3, 7, 999);


String str = Arrays.toString(x);

Wypełniamy komórki x[3], x[4], x[5]i x[6]wartością 999. Komórki tablicy są numerowane od zera!

Zmienna strzawiera wartość
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

Arrays.fill()Metoda działa tylko z tablicami jednowymiarowymi. Jeśli przekażesz do metody tablicę dwuwymiarową, będzie ona traktowana jako tablica jednowymiarowa, ze wszystkimi wynikającymi z tego konsekwencjami.

Arrays.copyOf()

„Amigo, powiedz mi proszę, jak zmienić rozmiar tablicy po jej utworzeniu?”

„Umm… To podchwytliwe pytanie, prawda? Nie jestem już tak niedoświadczony. Prawidłowa odpowiedź brzmi: nie możesz! Nie możesz zmienić rozmiaru tablicy po jej utworzeniu”.

– Ale co, jeśli naprawdę chcesz?

„To wciąż niemożliwe!

„Właściwie, jeśli naprawdę chcesz, możesz! Za pomocą sztuczki programistycznej:

  1. Najpierw tworzysz nową tablicę o żądanej długości
  2. Następnie kopiujesz do niej wszystkie elementy z pierwszej tablicy.

„To są dwie rzeczy, które Arrays.copyOf()robi ta metoda. Tak wygląda jej wywoływanie:

Type[] name2 = Arrays.copyOf(name, length);

„Ta metoda nie zmienia istniejącej tablicy , ale zamiast tego tworzy nową tablicę i kopiuje do niej elementy starej tablicy”.

„Co jeśli długość nowej tablicy jest mniejsza niż długość istniejącej ?

„Świetne pytanie, Amigo! Jeśli elementy nie pasują, dodatkowe wartości są po prostu ignorowane”.

„A jeśli wręcz przeciwnie, są dodatkowe komórki, jakie są ich wartości początkowe?

„Jeśli długość nowej tablicy jest większa niż długość starej, komórki są wypełnione zerami.

Przykład:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int[] x2 = Arrays.copyOf(x, 5);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOf(x, 15);
String str3 = Arrays.toString(x3);


Zmienna str2zawiera wartość Zmienna zawiera wartość
"[1, 2, 3, 4, 5]"

str3
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]"

Arrays.copyOfRange()

„A co, jeśli chcesz uzyskać tablicę o długości 5 z tablicy o długości 10, ale potrzebujesz, aby zawierała ona ostatnie 5 elementów zamiast pierwszych 5? W takim przypadku potrzebujesz innej metody klasy Arrays. Arrays.copyOfRange()Tak to wygląda:

Type[] name2 = Arrays.copyOfRange(name, first, last);

„Ta metoda również tworzy nową tablicę, ale wypełnia ją elementami z dowolnego miejsca w oryginalnej tablicy. Gdzie first i last to indeksy pierwszego i ostatniego elementu, które należy umieścić w nowej tablicy. Czy możesz mi powiedzieć, czy ostatni element mieści się w tym zakresie?”

"Ha! Jak mawiał mój wielki nauczyciel, ' zgodnie ze starą dobrą (lub złą) tradycją Javy pamiętaj, że ostatni element nie mieści się w zakresie '."

„Amigo, rośniesz na naszych oczach.

Przykład:

int[] x = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

int[] x2 = Arrays.copyOfRange(x, 5, 10);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOfRange(x, 5, 15);
String str3 = Arrays.toString(x3);


Zmienna str2zawiera wartość Zmienna zawiera wartość
"[16, 17, 18, 19, 20]"

str3
"[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]"

Arrays.sort()

„Na koniec zostawiłem na koniec najprzyjemniejszą… mmm… metodę: sortowanie . Tablice są sortowane dość często w programowaniu. Oto 3 najpopularniejsze akcje podczas pracy z tablicami:

  • Sortowanie tablicy
  • Znalezienie minimalnego (lub maksymalnego) elementu tablicy
  • Wyznaczanie indeksu elementu w tablicy (znajdowanie elementu w tablicy)

„Muszę powiedzieć, że dobrze działające algorytmy sortowania nie są łatwe do napisania. Mówiąc dokładniej, jest to standardowe zadanie, a jako studentowi nie zaszkodzi czasem poćwiczyć pisanie algorytmów sortowania. Ale w pracy jest to lepiej nie marnować czasu na wymyślanie koła na nowo.Twórcy Javy umieścili tę sort()metodę w Arraysklasie.Wywołanie jej wygląda tak:

Arrays.sort(name);

Ta metoda sortuje przekazaną tablicę w porządku rosnącym.

Przykład:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x);
String str = Arrays.toString(x);


Zmienna strzawiera wartość
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

„Wspaniale! Wywołałem tylko jedną metodę i tablica została posortowana. Coś pięknego!”

„Nawiasem mówiąc, możesz posortować nie tylko całą tablicę, ale także tylko jej część. Tak wygląda jej wywołanie:

Arrays.sort(name, first, last);

„Gdzie pierwszy i ostatni to indeksy pierwszej i ostatniej komórki, których sortowanie powinno dotknąć. ORAZ…

„Już wiem, co powiesz! „Zgodnie ze starą dobrą (lub złą) tradycją Javy pamiętaj, że ostatni element nie wchodzi w zakres” .

Przykład:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x, 4, 8);
String str = Arrays.toString(x);


Zmienna strzawiera wartość
"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]"

„Aby posortować tablice, Java używa najszybszego algorytmu sortowania — QuickSort . Jego złożoność obliczeniowa zależy od rozmiaru tablicy i jest obliczana przy użyciu formuły N log(N).

„Sortowanie tablicy składającej się z 1000 elementów wymaga około 10 000 porównań elementów tablicy. Sortowanie tablicy składającej się z miliona elementów wymaga około 20 milionów porównań”.

Nie za dużo porównań, biorąc pod uwagę liczbę elementów!”

„Dokładnie to mówię. Algorytm QuickSort jest bardzo wydajny.

Arrays.binarySearch()

„No i ostatnia z najciekawszych metod tej Arraysklasy jest w stanie wyszukać zadaną wartość w tablicy. To nie jest zwykłe wyszukiwanie — to ukochane wyszukiwanie binarne . Sprowadza się do tego:

  • Najpierw sortowana jest tablica.
  • Następnie środkowy element tablicy jest porównywany z tym, którego szukamy.
  • Jeśli element jest większy niż element środkowy, wyszukiwanie jest kontynuowane w prawej połowie tablicy.
  • Jeśli szukany element jest mniejszy niż element środkowy, wyszukiwanie jest kontynuowane w lewej połowie tablicy.

„Ponieważ tablica jest posortowana, możliwe jest wyeliminowanie jej połowy w jednym porównaniu. Następnie w następnym kroku odrzucamy kolejną połowę i tak dalej”.

"Fantastycznie! Bardzo szybko idziemy prosto do celu!"

„Dokładnie. W tablicy składającej się z miliona (!) elementów algorytm wyszukiwania binarnego może znaleźć indeks żądanego elementu w zaledwie 20 porównaniach. Wadą algorytmu jest to, że tablica musi być najpierw posortowana, a sortowanie również wymaga czasu.

Tak wygląda wywołanie:

int index = Arrays.binarySearch(name, value);

„Gdzie namejest nazwa tablicy, którą należy przekazać już posortowaną (na przykład przy użyciu metody Arrays.sort()). Oraz valueelement, którego szukamy w tablicy. Wynik zwrócony przez metodę jest indeksem żądanego elementu tablicy .

Przykłady:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};
Arrays.sort(x);

int index1 = Arrays.binarySearch(x, 0);
int index2 = Arrays.binarySearch(x, -20);
int index3 = Arrays.binarySearch(x, 99);
int index4 = Arrays.binarySearch(x, 5);
xjest
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1(indeksy 0i 2są również dopuszczalne)
8
-7

„Co się stanie, jeśli żądany element pojawi się w tablicy wiele razy ?”

„To słuszne pytanie, Amigo. W tym przypadku algorytm zwróci indeks jednego z nich (nie ma gwarancji, że będzie to, powiedzmy, pierwszy lub odwrotnie — ostatni z tych zduplikowanych elementów) ”.

„Co jeśli tablica w ogóle nie zawiera żądanego elementu?”

„W takim przypadku algorytm zwróci indeks ujemny .

Dokumentacja

„Wszystko jasne, Rishi! To było bardzo interesujące”.

„Jeśli naprawdę uznałeś to za bardzo interesujące, przejrzyj w wolnym czasie oficjalną dokumentację klasy Arraysi jej metod w witrynie Oracle .

„Można przyjrzeć się bliżej np. metodom Arrays.mismatch()i Arrays.compare(). Najprawdopodobniej uda się je dobrze wykorzystać.

„I nie daj się zmylić liczbą metod. Każda metoda ma 5-10 wariantów, które różnią się tylko typem parametrów”.