Operacje na tablicach w Javie

ByKamil

Operacje na tablicach w Javie

We wcześniejszych częściach szkolenia poznaliśmy już zarówno tradycyjne tablice, jak i ich dynamiczne odpowiedniki w postaci klasy ArrayList. Do tej pory mamy opanowane umiejętności, takie jak deklarowanie i inicjowanie nowej tablicy oraz dostęp do elementów poprzez operator []. W tej lekcji przyjrzymy się bliżej klasie Arrays, która dostarcza szeregu przydatnych metod do pracy z tablicami.

Klasa Arrays

W jej zestawie znajduje się cały szereg metod statycznych do wykonywania przeróżnych operacji na tablicach. Pierwsze spojrzenie w dokumentację może przytłaczać mnogością dostarczonych algorytmów. Jednakże gdy się dokładniej przyjrzymy, to zauważymy, że jest to spowodowane typami danych, które przechowują tablice. Z tego względu skupimy się na konkretnych czynnościach, a nie typach zmiennych przechowywanych w tablicach.

Zamiana tablicy String na listę

Operacja ta wymaga jedynie tablicy z obiektami typu String oraz wczytanie odpowiednich bibliotek.

Rezultatem wykonania powyższego kodu będzie.

Jak widać wystarczy użyć metody asList() dostępnej w klasie Arrays.

Zamiana tablicy zawierającej typy proste na listę

Analogiczna próba konwersji z dowolnego typu prostego na listę zakończy się niepowodzeniem. Jak nauczyliśmy się w rozdziale o klasach osłonowych do list można zapisywać jedynie obiekty. Dlatego typy proste należy najpierw opakować do odpowiednich im klas. Poniżej pokażemy przykład jak przekonwertować tablicę typu int na listę zawierającą obiekty Integer.

Jak widać w tym przypadku potrzebujemy tablicy pośredniej, która będzie przechowywała obiekty. Dopiero ją możemy przekonwertować na listę.

Java 8

W Javie od wersji 8 możemy zrobić to nieco prościej wykorzystując strumienie.

W obu przypadkach wynik wykonania kodu będzie następujący.

Kopiowanie tablic

Jak pamiętamy przypisanie zmiennej tablicowej nie powoduje utworzenie kopii tablicy, a jedynie dodatkową referencję od niej. Inaczej mówiąc modyfikując tablicę przy użyciu pierwszej referencji zmienia także tablicę, na którą wskazuje druga. Nie ma w tym nic dziwnego – w końcu to ten sam obiekt w pamięci komputera.

W klasie Arrays dostępna jest metoda copyOf() dostępna w kilku wariantach – dla każdego typu w tym sparametryzowana. Tym razem użyjemy tablicy znakowej char.

Metoda equals() zwróciła false, co jest dowodem, że tym razem są to dwie tablice. Jak pamiętamy nie zwraca ona tylko czy zawartość jest identyczna, ale porównuje też kod mieszający (ang. hash code) obiektu. Ostatecznie jeśli zmodyfikujemy zawartość tablicy copy, to tablica tab pozostaje nienaruszona.

Sortowanie tablic

Stosując metodę sort() tablice są sortowane algorytmem quick sort. Implementacja zastosowana przez twórców zapewnia wysoką wydajność operacji O(n log(n)).

Sortowanie w porządku rosnącym (ang. ascending)

Ten porządek sortowanie jest domyślnym dla metody sort().  Jak widać na powyższym listingu wystarczy w argumencie przekazać tablicę do posortowania.

Sortowanie tablicy w porządku malejącym (ang. descending)

Java nie posiada domyślnie przygotowanej metody, która sortowałaby tablicę w porządku malejącym. Zamiast tego musimy dostarczy obiekt klasy Comparator, który wykona odpowiednie porównania. Z pomocą przychodzą klasy opakowujące gdyż jak pamiętamy nie można zaimplementować metody compareTo() dla typów prostych. Jest to możliwe jedynie dla typów obiektowych. Klasa Collection w metodzie reverseOrder() dostarcza komparator, który pozwala nam w prosty sposób odwrócić kolejność tablicy.

Jak widać wystarczy go dopisać jako argument do metody sort().

Wynik uruchomienia powyższego listingu jest następujący.

Wypełnianie tablicy jedną wartością

Klasa Arrays dostarcza metodę fill(), która pozwala na wypełnienie całej tablicy lub jej fragmentu podaną wartością.

W powyższym przypadku pusta tablica zostaje zapełniona zmiennymi typu char o wartości ‚a’. Metoda działa identycznie dla każdego typu danych. Należy tylko uważać na automatyczne konwersje

Wynik uruchomienia programu jest następujący.

 

About the author

Kamil editor