JavaRush /Blog Java /Random-PL /Klasa Arrays i jej zastosowanie

Klasa Arrays i jej zastosowanie

Opublikowano w grupie Random-PL
Witam ponownie! :) Na ostatniej lekcji zapoznaliśmy się z taką strukturą danych jak tablica (tablica Java), nauczyliśmy się tworzyć tablice, wypełniać je danymi, a także dowiedzieliśmy się, jak są przechowywane w pamięci. Dzisiaj przyjrzymy się niektórym zadaniom i przykładom pracy z tablicami, z którymi często spotkasz się w prawdziwej pracy. Wyobraźmy sobie na przykład taką sytuację: mamy tablicę 10 liczb zapisanych w losowej kolejności.
//array Java, example
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Naszym zadaniem jest posortowanie tej tablicy w kolejności rosnącej: od najmniejszej do największej liczby. Ostatecznie powinno to wyglądać tak:
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Jak to zrobić? Zadanie nie jest trywialne, nigdy wcześniej tego nie robiliśmy :/ Jakieś pomysły? Spróbuj zgadnąć. Oto co możemy zrobić na przykład:
  • Iteruj po wszystkich elementach tablicy. Porównaj każdy element z następnym ( [0]z [1], [1]z [2], [2]z [3]itp.). Jeśli bieżący element tablicy jest większy od następnego, zamieniamy je miejscami i przechodzimy do następnego elementu. Jeśli nie, zostaw tak jak jest i idź dalej.

  • Zatem po pierwszym przejściu przez elementy tablicy największa wartość (167) z pewnością znajdzie się w ostatniej komórce.

  • Teraz przejrzyjmy jeszcze raz wszystkie elementy tablicy, zaczynając od elementu z indeksem [0], ale aż do przedostatniego elementu (największa liczba jest już na swoim miejscu) i dokonajmy tych samych porównań i zamian. 
    Na koniec w przedostatniej komórce będziemy mieli drugą co do wielkości wartość (99).

  • Powtórzmy tę pracę tyle razy, ile mamy elementów minus jeden w tablicy.
Klasa Arrays i jej zastosowanie - 2Wpadliśmy na pomysł, pozostało tylko napisać kod. Będzie to wyglądać tak:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Porównaj elementy parami,
             jeśli są w złej kolejności,
             to zamień je */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
Hmm... Wygląda to trochę skomplikowanie -_- Nawet jeśli ogólna zasada działania jest jasna, to trzeba napisać całkiem sporo kodu, żeby rozwiązać tak pozornie proste zadanie. No dobrze, może po prostu przeceniliśmy się? Prawdopodobnie zadanie, którego się podjęliśmy, jest dla nas dotychczas zbyt trudne. Spróbujmy zrobić coś prostszego. Weźmy na przykład tę samą tablicę liczb.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Naszym zadaniem jest skopiowanie jego zawartości do innej tablicy.
int [] numbersCopy = new int[10];
Zastanów się, jak byś to zrobił, korzystając z wiedzy o tablicach, którą już posiadasz? Możesz na przykład przeglądać tablicę numbersi zapisywać jej elementy jeden po drugim w numbersCopy:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];

       for (int i = 0; i < numbers.length; i++) {

           numbersCopy[i] = numbers[i];
       }

   }
}
No cóż, mniej więcej nam się to udało! Wydaje się, że problem został rozwiązany, ale powtórzę: jeśli trzeba go często wykonywać, kod będzie miał kilka identycznych pętli. Tak naprawdę te i inne problemy już dawno rozwiązali twórcy Javy i nie musimy „wymyślać koła na nowo” i pisać kodu dla własnego rozwiązania.

Klasa tablic Java

Specjalna klasa Java pomoże Ci rozwiązać typowe problemy podczas pracy z tablicami - Arrays. Do tej klasy dodano metody rozwiązujące najczęstsze problemy, z jakimi spotykają się programiści Java w swojej pracy. Na przykład zadanie sortowania tablicy, dla którego sami próbowaliśmy znaleźć rozwiązanie, można rozwiązać w jednym wierszu:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
Metoda Arrays.sort()sortuje tablicę. Co więcej, wbudowany w niego algorytm sprawia, że ​​jest to znacznie wydajniejsze niż kod, który napisaliśmy. Wyjście konsoli:

[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Uwaga: aby przekonwertować tablicę na ciąg znaków, użyliśmy innej metody klasowej Arrays- Arrays.toString(). Same tablice Java nie zastępują toString(). Więc jeśli po prostu napiszesz
System.out.println(numbers.toString());
zostanie wywołana metoda toString()klasy Object. W przypadku tablic wynik będzie mniej więcej taki:

[I@4554617c
Nie będziemy teraz wdawać się w szczegóły, dlaczego wniosek jest taki; najważniejsze jest to, że wyraźnie nie tego potrzebujemy. Ale Arrays.toString() zrobiło to, co chcieliśmy. Nawiasem mówiąc, nasz problem z kopiowaniem można również łatwo rozwiązać w klasie Arrays:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Do metody Arrays.copyOf()przekazujemy naszą oryginalną tablicę (z której musimy skopiować wartości) oraz długość nowej tablicy, do której kopiujemy dane. W tym przypadku wskazaliśmy jako długość numbers.length, ponieważ chcemy skopiować całą tablicę. Jeśli chcemy skopiować tylko kilka pierwszych elementów, możemy określić mniejszą długość nowej tablicy:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Tutaj określiliśmy długość nowej tablicy na 4. W związku z tym tylko pierwsze 4 elementy numberszostaną skopiowane do nowej tablicy. Wyjście konsoli:

[167, -2, 16, 99]
Nawiasem mówiąc, jeśli chcesz skopiować część tablicy, ale nie od początku, ale „od środka”, Arraysmożesz to również zrobić:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Wniosek:

[16, 99, 26, 92]
Liczby z komórek od drugiego ( włącznie ) do sześciu ( niewłącznie ) zostały skopiowane do nowej tablicy. Ponadto może zaistnieć potrzeba porównania dwóch tablic ze sobą. Podobnie jak w przypadku metody toString(), same tablice nie przesłaniają metody equals(). Jeśli więc spróbujemy je porównać w ten sposób:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
otrzymujemy wynik false. Object.equals()Przecież metoda porównująca linki będzie się nazywać . I oczywiście, że są różne! Musimy jednak porównać zawartość tablic, a nie łącza. Klasa Arrayszawiera przesłoniętą metodę equals(), która robi dokładnie to, czego potrzebujemy:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
Wniosek:

true
Nawiasem mówiąc, klasa Arraysdziała z powodzeniem nie tylko ze zwykłymi tablicami, ale także z tablicami dwuwymiarowymi:
public class Main {

   public static void main(String[] args) {

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

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println(„Czy te dwuwymiarowe tablice są sobie równe?”);
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
Wniosek:

Равны ли эти двумерные массивы между собой?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Jak widać metoda Arrays.copyOf()poradziła sobie z kopiowaniem tablicy dwuwymiarowej. Należy pamiętać, że w tym przypadku podczas kopiowania tablicy dwuwymiarowej następuje tzw. „płytka kopia”. Do porównywania tablic dwuwymiarowych i wysyłania ich na konsolę służą specjalne metody - deepEqualsand deepToString(); W przyszłości nie raz zobaczysz (i będziesz się z tego cieszył), że twórcy Javy przewidzieli wiele typowych sytuacji, z jakimi spotykają się programiści podczas pracy, i wdrożyli dla nich gotowe rozwiązania w języku. Korzystanie z tych rozwiązań jest znacznie łatwiejsze i wygodniejsze niż wymyślanie kół na nowo, prawda? :) Koniecznie przeczytaj dokumentację klasy Arraysw witrynie Oracle . Powodzenia z Twoimi studiami!
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION