Autor
Aditi Nawghare
Software Engineer at Siemens

Klasa tablic

Opublikowano w grupie Random-PL
Witam ponownie! :) W dzisiejszej lekcji porozmawiamy o klasie Arrays w Javie. Na ostatniej lekcji poznaliśmy taką strukturę danych zwaną tablicą. Nauczyliśmy się je tworzyć i wypełniać danymi. Przyjrzeliśmy się, jak są przechowywane w pamięci. Dzisiaj przyjrzymy się niektórym zadaniom i przykładom pracy z tablicami, które często można zobaczyć w prawdziwej pracy. Na przykład wyobraź sobie taką sytuację: Mamy tablicę 10 liczb losowych.
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. Ostatecznie powinno to wyglądać tak: [-234, -2, 16, 26, 35, 43, 92, 99, 167] Jak to zrobić? To zadanie nie jest trywialne. Nigdy wcześniej tego nie robiliśmy :/ Jakieś pomysły? Spróbuj zgadnąć. Oto jedno rozwiązanie:
  • Przejrzyj wszystkie elementy tablicy. Porównaj każdy element z następnym ([0] z [1], [1] z [2], [2] z [3] itd.). Jeśli bieżący element jest większy niż następny, zamieniamy je miejscami, a następnie przechodzimy do następnego elementu. Jeśli nie, zostaw je tak, jak są i idź dalej
  • Tak więc, po pierwszym przejściu przez elementy, największa wartość (167) z pewnością znajdzie się w ostatniej komórce.
  • Teraz ponownie przejrzymy wszystkie elementy, ale tym razem zaczniemy od indeksu [0] do przedostatniego elementu (największa liczba jest już na swoim miejscu) i dokonamy tych samych porównań i zamian. Po tym przejściu w przedostatniej komórce będziemy mieli drugą co do wielkości wartość (99).
  • Powtórz ten proces tyle razy, ile mamy elementów tablicy.
Mamy pomysł. Teraz musimy tylko napisać kod. To wygląda tak: Klasa tablic i jej zastosowanie - 2
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++) {
           /* Compare the elements in pairs.
             If they are not in the right order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
Uh... Wygląda to trochę skomplikowanie -_- Nawet jeśli ogólna zasada jest zrozumiała, to i tak musimy napisać całkiem sporo kodu, aby rozwiązać tak proste zadanie. Dobra, może po prostu przeceniliśmy samych siebie? Zadanie, którego się podjęliśmy, jest dla nas prawdopodobnie wciąż zbyt skomplikowane. Spróbujmy czegoś 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];
Pomyśl, jak byś to zrobił, korzystając z tego, co już wiesz o tablicach? Na przykład, możesz przejść przez tablicę liczb w pętli i sekwencyjnie zapisać jej elementy w numerachCopy :
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];
       }

   }
}
Cóż, uh, tutaj w zasadzie to zrobiliśmy! Wygląda na to, że rozwiązaliśmy problem. Jeśli jednak musisz to robić często, Twój kod będzie zawierał kilka identycznych pętli. W rzeczywistości te (i inne) zadania były od dawna rozwiązywane przez twórców Javy. Nie musimy „wynajdywać koła na nowo” i kodować własnego rozwiązania. Istnieje specjalna klasa statyczna ( Arrays ), która pomaga w wykonywaniu typowych zadań podczas pracy z tablicami. Do tej klasy dodano metody wykonywania najczęstszych zadań, z którymi stykają się programiści Java. Na przykład zadanie sortowania tablicy, które próbowaliśmy obsłużyć, jest rozwiązane 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ę. A jego algorytm jest znacznie wydajniejszy niż kod, który napisaliśmy. Dane wyjściowe konsoli: [-234, -2, 16, 26, 35, 43, 80, 92, 99, 167] Uwaga: Aby przekonwertować tablicę na łańcuch, użyliśmy innej metody klasy Arrays : Arrays.toString() . Tablice w Javie same nie zastępują metody toString() . Więc jeśli po prostu piszesz
System.out.println(numbers.toString());
zostanie wywołana metoda toString() klasy Object . W przypadku tablicy wynik będzie wyglądał mniej więcej tak: [I@4554617c Nie będziemy teraz wchodzić w szczegóły, dlaczego właśnie taki jest wynik. Najważniejsze jest to, że najwyraźniej nie jest to to, czego potrzebujemy. Ale Arrays.toString() robi dokładnie to, czego chcemy. Nawiasem mówiąc, kopiowanie jest również łatwe do wykonania za pomocą klasy 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 chcemy skopiować wartości) oraz długość nowej tablicy, do której kopiujemy dane. W tym przypadku podaliśmy liczbę. długość jako długość, ponieważ chcemy skopiować całą tablicę. Gdybyśmy chcieli skopiować tylko kilka pierwszych elementów, możemy określić długość nowej, mniejszej 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 4 jako długość nowej tablicy. W związku z tym tylko pierwsze 4 elementy liczb zostaną skopiowane do nowej tablicy. Wyjście konsoli: [167, -2, 16, 99] Nawiasem mówiąc, tablice umożliwiają również kopiowanie części tablicy ze środka, a nie z początku 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.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Dane wyjściowe: [16, 99, 26, 92] Liczby zostały skopiowane do nowej tablicy z drugiej tablicy od drugiego (włącznie) do szóstego (nie włącznie) elementu. Może być również konieczne porównanie dwóch tablic. Podobnie jak w przypadku metody toString() , same tablice nie zastępują metody equals() . Więc jeśli 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));
   }
}
wtedy otrzymamy fałsz. Dzieje się tak, ponieważ zostanie wywołana metoda Object.equals() , która porównuje referencje. I oczywiście są różne! Ale to, czego potrzebujemy, to porównać zawartość tablicy, a nie referencje. Klasa Arrays zastępuje metodę equals() , aby robiła dokładnie to, czego chcemy:
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));
   }
}
Wyjście: true Nawiasem mówiąc, klasa Arrays działa 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("Are these two-dimensional arrays equal?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
Wyjście: Czy te dwuwymiarowe tablice są równe? true [[1, 2, 3], [4, 5, 6], [7, 8, 9]] Jak widać, metoda Arrays.copyOf() była w stanie skopiować dwuwymiarową tablicę. A klasa ma specjalne metody do porównywania i wyświetlania tablic dwuwymiarowych: deepEquals i deepToString() . W przyszłości wielokrotnie zobaczysz (i będziesz się z tego cieszyć), że twórcy Javy przewidzieli wiele sytuacji, z którymi często spotykają się programiści, i zaimplementowali dla nich gotowe rozwiązania w języku. Korzystanie z tych rozwiązań jest znacznie łatwiejsze i wygodniejsze niż wymyślanie koła na nowo, prawda? :) Koniecznie przeczytaj dokumentację klasy Arrays na stronie Oracle . Powodzenia w nauce!
Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy