Klasa Arrays - przykłady zastosowań

Dość często korzystamy z tablic jedno i wielowymiarowych. Klasa java.util.Arrays dostarcza wielu ciekawych metod ułatwiających pracę z tymi strukturami danych. Większość z nich jest przeciążona obsługując wiele typów danych (metoda przeciążona - metoda o takiej samej nazwie, ale różnej ilości lub rodzaju argumentów). Poniżej kilka przykładów wykorzystania tych metod (pamietaj o imporcie odpowiedniego pakietu - import java.util.*).

Wyświetlanie tablicy - metoda toString()

Metoda toString() zwraca tablicą jednowymiarową w formie tekstowej. Poszczególne elementy oddzielone są przecinkami. Jako parametr wywołania podajemy interesującą nas tablicę.
int[] tablica = {3, 8, 5, 6, 9, 2, 7, 4, 1};
System.out.println(Arrays.toString(tablica));
Wynik:
[3, 8, 5, 6, 9, 2, 7, 4, 1]
Jest to znaczące ułatwienie wyświetlania wszelkiego rodzaju tablic (nie musimy juz stosować pętli for). Dla tablic wielowymiarowych istnieje rekurencyjna wersja tej metody o nazwie deepToString().
int[][] macierz = { { 3, 8, 5},
                    { 5, 9, 2},
                    { 7, 4, 1} };
  
System.out.println(Arrays.deepToString(macierz));
Wynik:
[[3, 8, 5], [5, 9, 2], [7, 4, 1]]
Wypełnianie tablicy wartością - metoda fill()

Gdy chcemy wypełnić zawartość tablicy jakąś wartością możemy wykorzystać metodę fill(). Ma ona dwa parametry, pierwszy tablicę i drugi wartość jaką chcemy ją wypełnić.
int[] tablica = {3, 8, 5, 6, 9, 2, 7, 4, 1};
System.out.println(Arrays.toString(tablica));  
   
Arrays.fill(tablica, 14);
System.out.println(Arrays.toString(tablica));
Wynik:
[3, 8, 5, 6, 9, 2, 7, 4, 1]
[14, 14, 14, 14, 14, 14, 14, 14, 14]
Możemy również wykorzystać wypełnianie tylko części tablicy określoną wartością. Wykorzystamy do tego inną wersję metody fill() z czterema parametrami (dwa dodatkowe to indeks pierwszego i ostatniego elementu, który będziemy zmieniać, w przykładzie wartości 2 i 5).
int[] tablica = {3, 8, 5, 6, 9, 2, 7, 4, 1};
System.out.println(Arrays.toString(tablica));  
   
Arrays.fill(tablica, 2, 5, 14);
System.out.println(Arrays.toString(tablica));  
Wynik:
[3, 8, 5, 6, 9, 2, 7, 4, 1]
[3, 8, 14, 14, 14, 2, 7, 4, 1]
Sortowanie tablicy - metoda sort()

Tablice możemy sortować za pomocą metody sort() (wykorzystywany jest algorytm sortowania szybkiego - quickSort).
int[] tablica = {3, 8, 5, 6, 9, 2, 7, 4, 1};
System.out.println(Arrays.toString(tablica));  

Arrays.sort(tablica);    
System.out.println(Arrays.toString(tablica));    
Wynik:
[3, 8, 5, 6, 9, 2, 7, 4, 1]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Przeciążona wersja metody sort() (z trzema parametrami) umożliwia sortowanie tylko części tablicy. Dodatowo podajemy indeks pierwszego i ostatniego elementu do sortowania. Jeżeli nasza tablica zawiera obiekty to muszą one implementować interfejs Comparable (pisałem o nim w poście Porównujemy obiekty - interfejs Comparable<T>).

Wyszukiwanie elementu - metoda binarySearch()

Znalezienie szukanej wartości w tablicy to zadanie dla metody binarySearch(). Ponieważ wykorzystuje ona wyszukiwanie binarne to tablica musi być już wstępnie posortowana. Metoda zwraca numer indeksu, na którym znajduje się poszukiwany element lub wartośc -1 jeśli taki element nie występuje w tablicy. Poniższy przykład sortuje tablicę oraz szuka w niej wartości 4.
int[] tablica = {3, 8, 5, 6, 9, 2, 7, 4, 1};
System.out.println(Arrays.toString(tablica));  
   
Arrays.sort(tablica);    
System.out.println(Arrays.toString(tablica));    
         
System.out.println(Arrays.binarySearch(tablica, 4));   
Wynik (tablica nieposortowana, posortowana oraz indeks na którym znajduje się wartość 4):
[3, 8, 5, 6, 9, 2, 7, 4, 1]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
3
Możemy również wykorzystać przeciążoną wersję metody binarySearch() wyszukującą tylko w określonej części posortowanej tablicy.

Porównywanie zawartości tablic - metoda equals()

Sprawdzenie czy dwie tablice są takie same (zawierają takie same elementy) realizowane jest za pomocą metody equals(). Zwraca ona prawdę (wartość true) jeśli tak i fałsz (wartość false) jeśli nie.
int[] tablicaA = {3, 8, 5, 6, 9, 2, 7, 0, 1};
int[] tablicaB = {3, 8, 5, 6, 9, 2, 7, 4, 1};         
   
if(Arrays.equals(tablicaA, tablicaB)) 
 System.out.println ("Tablice są takie same.");
else 
 System.out.println ("Tablice są różne.");
Wynik:
Tablice są różne.
Dla tablic wielowymiarowych odpowiednią metodą porównującą jest deepEquals().

Mieszanie zawartości tablicy...

Ostatnia przydatna rzecz to możliwość pomieszania elementów występujących w tablicy. Nie do końca ma to związek z klasą Arrays, ale... Załóżmy, że mamy taką tablicę:
String[] imiona = { "Adam", "Marek", "Iwona", "Patryk", "Dorota", "Ewa"};
W klasie obsługującej kolekcje (Collections) istnieje metoda, która miesza (ang. shuffle) elementy danej kolekcji (kolekcja to pojemnik przechowujący jakieś dane). Gdyby udało nam się zamienić naszą tablicę na kolekcję to moglibyśmy wykorzystać metodę mieszającą. Z pomocą przychodzi metoda toList() z klasy Arrays. Zamienia ona naszą tablicę w listę (obiekt klasy List), która jest już częścią kolekcji i daje nam możliwość wykorzystania metody shuffle().
Collections.shuffle(Arrays.asList(imiona));
System.out.println(Arrays.toString(imiona));
Przykładowa zawartość naszej tablicy po wymieszaniu elementów:
[Marek, Patryk, Ewa, Dorota, Adam, Iwona]
Elementami kolekcji mogą być tylko typy obiektowe. Gdybyśmy chcieli pomieszać typy prymitywne to wystarczy użyć klas opakowujących i tak na przykład dla tablicy z wartościami typu int możemy użyć poniższego kodu (konwersja między typem int, a Integer jest automatyczna).
Integer[] tablica = {3, 8, 5, 6, 9, 2, 7, 4, 1};
Collections.shuffle(Arrays.asList(tablica));
System.out.println(Arrays.toString(tablica));
Przykładowy wynik:
[1, 9, 6, 3, 7, 2, 5, 4, 8]


1 Komentarz - Klasa Arrays - przykłady zastosowań

Anonimowy pisze...

Witam.
Warto zwrocic uwage, ze w czteroargumentowej metodzie fill, przedzial wartosci, ktore beda wypelniane jest lewostronnie domkniety i prawostronnie otwarty. Dla mnie bylo to troche dziwne :)

Prześlij komentarz

Możesz użyć niektórych tagów HTML, takich jak <b>, <i>, <u>, <a> Nie spamuj :)

Popularne posty