„Amigo, mam nadzieję, że już zdałeś sobie sprawę, jak przydatne są tablice w programowaniu?”

„Zdecydowanie, Rishi! Rozwiązałem już więcej niż jedno zadanie”.

„Czy twoje zadania miały powtarzalne czynności? Takie, które wykonywałeś w kółko”.

„Jeśli dobrze cię zrozumiałem, masz na myśli podobne działania w różnych zadaniach? Na przykład wszędzie używanie pętli do wyświetlania zawartości tablicy — mam już tego dość!”

„Tak, o to mi chodzi. Twórcy Javy zauważyli, że programiści Javy często piszą ten sam kod podczas pracy z tablicami. Na przykład kod kopiujący część tablicy do innej tablicy lub kod wypełniający każdą komórkę tablicy tym samym value.Albo twój przykład: kod do wyświetlenia zawartości tablicy w czytelnej formie na ekranie.

„A prawdziwi programiści mają jedną bardzo ważną zasadę: nie powtarzaj się. Zgodzisz się, że wykonywanie zbędnej pracy jest złe – nie dostaniesz za to zapłaty. Efektywna praca jest dobrze płatna, wierz mi. Nawiasem mówiąc, początkujący kod jest natychmiast rozpoznawalny dzięki dużej ilości powtarzającego się kodu.

„Twórcy Javy zastanowili się nad tym i stworzyli specjalną Arraysklasę (jej pełna nazwa to java.util.Arrays), umieszczając w niej najpopularniejsze akcje związane z tablicami”.

„Hmm… Bardzo interesujące. Więc co dokładnie zawiera?

„Ma wiele metod na każdą okazję, ale najpierw rozważymy tylko 10 z nich — najprostszych i najczęściej używanych.

Arrays.toString()

„Pierwsza metoda, której się przyjrzymy, to Arrays.toString()… Ale najpierw trochę tła.

„Każda tablica w Javie ma toString()metodę, która zwraca„ tekstową reprezentację tablicy ”. Tekstową reprezentację tablicy można uzyskać za pomocą następującej instrukcji:

String str = name.toString();

„Gdzie namejest nazwa zmiennej tablicowej i strczy jest to nazwa zmiennej, która będzie przechowywać ciąg reprezentujący tablicę. Amigo, czy próbowałeś wydrukować tablicę na ekranie za pomocą tej metody?System.out.println(name)

Przyznaję, tak się stało. Widziałem jakiś bełkot. Postanowiłem trzymać się z dala od niebezpieczeństw i nadal używać pętli.

„Najprawdopodobniej widziałeś coś takiego:

I@37afeb11

„Pierwsza litera Ioznacza, że ​​jest to inttablica, a kolejne symbole@ to adres pojedynczego obiektu w pamięci. Można o tym myśleć jak o adresie tablicy w pamięci. Z jednej strony jest to dokładnie informacja przechowywana w zmiennej tablicowej, ale z drugiej strony spodziewałeś się czegoś innego, prawda?”

„Dokładnie! Planowałem zobaczyć wartości w tablicy. To była ostatnia rzecz, jakiej się spodziewałem”.

„I właśnie dlatego wymyślili metodę Arrays.toString()— wyświetlanie wartości tablicy. Nazywamy to tak:

String str = Arrays.toString(name);

Przykłady:

int[] array = {1, 2, 3};
String str = Arrays.toString(array);
Zmienna strbędzie zawierać ciąg"[1, 2, 3]"
int[] array = {};
String str = Arrays.toString(array);
Zmienna strbędzie zawierać ciąg"[]"
String[] array = {"Hi", "How's", "life?"};
String str = Arrays.toString(array);
Zmienna strbędzie zawierać ciąg"[Hi, How's, life?]"

Arrays.deepToString()

„Jednak toString()metoda nie jest odpowiednia, jeśli chodzi o tablice dwuwymiarowe. Innymi słowy, jeśli spróbujesz wywołać Arrays.toString(), zobaczysz coś znajomego:

[I@37afeb11, I@37afeb21, I@37afeb31]

„To wszystko dlatego, że komórki tablicy dwuwymiarowej przechowują odniesienia do tablic jednowymiarowych. A jak tablice jednowymiarowe są konwertowane na ciąg znaków? Dokładnie tak, jak widać powyżej.

„Co w takim razie robić? Jak poprawnie wyświetlić tablicę dwuwymiarową?”

„Twórcy Javy też to przewidzieli. W tym celu Arraysklasa ma jeszcze jedną specjalną metodę — deepToString(). Wywołanie jej wygląda następująco:

String str = Arrays.deepToString(name);

„Ta metoda może przekazywać tablice, które są dwuwymiarowe, jednowymiarowe, trójwymiarowe lub ogólnie w dowolnym wymiarze, i zawsze wyświetla elementy tablicy.

Przykłady:

int[] array = {1, 2, 3};
String str = Arrays.deepToString(array);
Zmienna strbędzie zawierać ciąg"[1, 2, 3]"
int[][] array = { {1, 1}, {2, 2}, {3, 3} };
String str = Arrays.deepToString(array);
Zmienna strbędzie zawierać ciąg"[[1, 1], [2, 2], [3, 3]]"
int[][][] array = { {{1, 2, 3}, {1}}, {{}} };
String str = Arrays.deepToString(array);
Zmienna strbędzie zawierać ciąg"[[[1, 2, 3], [1]], [[]]]"

Arrays.equals()

„Wymyśliliśmy, jak wyświetlać tablice na ekranie. A co z porównywaniem tablic? Pamiętasz, jakimi metodami możemy porównywać ciągi znaków?”

„Zwykle stosuję equalsmetodę!

„Tak, equals, a także equalsIgnoreCase(który porównuje ciągi znaków bez względu na wielkie i małe litery).

„Dobra wiadomość: możesz również użyć equalsmetody tablic. Zła wiadomość: nie porównuje zawartości tablic. Metoda equalstablic robi to samo, co ==operator — porównuje referencje.

Przykłady:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1 == x2;
false(referencje nie są równe)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1.equals(x2);
Metoda equalspo arraysprostu porównuje referencje dwóch tablic.

false(referencje nie są równe)

„Więc co robimy? Jak porównujemy tablice na podstawie ich zawartości?”

„Znów Arraysprzychodzi nam na ratunek klasa, a dokładniej jej Arrays.equals()metoda. Oto jak ją nazywamy:

Arrays.equals(name1, name2)

„Metoda zwraca, truejeśli tablice są równej długości i ich elementy są równe. W przeciwnym razie zwraca false.

Przykłady:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1.equals(x2);
Metoda equalspo arraysprostu porównuje referencje dwóch tablic.

false(referencje nie są równe)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
Arrays.equals(x1, x2);


true(zawartość jest równa)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3, 4};
Arrays.equals(x1, x2);


false(zawartość tablic jest inna)

Arrays.deepEquals()

„I jak już zapewne się domyślacie, Arrays.equalsmetoda nie zadziała poprawnie w przypadku tablic dwuwymiarowych: traktuje tablice dwuwymiarowe jak tablicę jednowymiarową, której elementami są adresy tablic jednowymiarowych.

„Dlatego, aby poprawnie porównać tablice wielowymiarowe ( n = 1, 2, 3,... ), wymyślili metodę Arrays.deepEquals(). Wywołanie jej wygląda tak:

Arrays.deepEquals(name1, name2)

„Metoda zwraca true, jeśli tablice są równej długości i ich elementy są równe. W przeciwnym razie zwracafalse. Jeśli elementy wewnątrz tablicy są również tablicami, to Arrays.deepEquals()metoda jest używana do ich porównania i tak dalej.

Przykłady:

int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};

x1.equals(x2);
Metoda equalspo arrays prostu porównuje referencje dwóch tablic.

false(referencje nie są równe)
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};

Arrays.equals(x1, x2);
Metoda Arrays.equalsporówna i jako jednowymiarowe tablice przechowujące referencje. Zawierają różne odniesienia. (zawartość tablic nie jest równa) x1x2
false
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};

Arrays.deepEquals(x1, x2);



true(zawartość jest równa)

„Dziękuję, Rishi! Ta lekcja jest właśnie tym, czego potrzebowałem, aby uczynić moje życie łatwiejszym i szczęśliwszym w przyszłości. Teraz będę korzystał z metod klasy Arrays i jeszcze szybciej będę pisał swoje programy.

„Na to właśnie liczyłem, ha-ha. Ale to nie wszystkie interesujące metody w klasie Arrays. O innych opowiem ci następnym razem”.