Jason. Cała informatyka w jednym miejscu!

Póki co, postanowiłem uznać serię artykułów na temat wątków w Java za zakończoną. Rzućmy teraz okiem na kolekcje. Co byście powiedzieli gdyby konieczne było sortowanie kolekcji w języku Java? Czy to znaczy, że trzeba w te pędy uczyć się algorytmów sortowania? Jest możliwość posortowania najbardziej powszechnie stosowanej kolekcji bez stosowania jakichkolwiek algorytmów czy skomplikowanych sztuczek (jak się później okaże, zależy jakiego typu są argumenty). Zapraszam do środka artykułu.

SORTOWANIE W JĘZYKU JAVA WYKONASZ PRZEZ JEDNO WYWOŁANIE!

Czy macie pojęcie, że w przypadku kolekcji "ArrayList", możecie za pomocą statycznej metody "sort" klasy "Collections", posortować sobie argumenty? Pakiet "java. util.Collections" umożliwia natychmiastowe rozwiązanie problemu za pomocą pojedynczego wywołania wymienionej metody:

Collections.sort([kolekcja ArrayList]);

PRZYKŁAD KODU ŹRÓDŁOWEGO

Zróbmy sobie przykładową kolekcję "ArrayList" przechowującą liczby całkowite. Dodajemy do niej parę liczb i chcemy je posortować w kolejności od najmniejszej do największej, nie patrząc na razie na szczegóły. Oto przykładowy projekt gotowy do skompilowania:

KLASA "MAIN"

public class Main {
	public static void main(String[] args) {
		new Launcher();
	}
}

KLASA "LAUNCHER"

import java. util.ArrayList;
import java. util.Collections;

public class Launcher {
	private final ArrayList<Integer> integers = new ArrayList<>(Arrays.asList(6, -12, 743, 290, -56, 7000));

	public Launcher() {
		printNumbers();
		Collections.sort(integers);
		printNumbers();
	}

	private void printNumbers() {
		System.out.println("\nWYPISYWANIE LISTY:");
		integers.forEach(System.out::println);
	}
}

To jest prosty przykład ukazujący jak wygląda tworzenie, dodawanie liczb i sortowanie kolekcji w języku Java. Za przykład dałem "ArrayList" jednak w przypadku innych rodzajów kolekcji może być konieczne użycie metody sortującej już bezpośrednio z instancji. Dorzuciłem wypisywanie liczb przed i po procesie sortowania również za pomocą jednej linijki kodu, dzięki referencji do metody. Po kompilacji i uruchomieniu powyższego programu, ujrzymy dwa ciągi tekstów. Jeden ukazuje zawartość kolekcji zgodnie z kolejnością wprowadzonych do niej liczb, a drugi prezentuje posortowane argumenty w kolejności rosnącej.

A GDYBYM CHCIAŁ(A) W DRUGĄ STRONĘ?

Warto nadmienić, że możemy też bez żadnych przeszkód wymusić sortowanie w drugą stronę (od największej do najmniejszej liczby) zmieniając trochę treść wywołania. Zamieniając ją na to:

integers.sort(Collections.reverseOrder());

program bez problemu posortuje nam liczby całkowite malejąco. Metoda "Collections.reverseOrder" zwraca tak zwany "Comparator" - interfejs funkcyjny definiujący sposób sortowania elementów poprzez wyrażenie arytmetyczne (w tym przypadku określa ono sortowanie w drugą stronę). Ponieważ "sort" zawiera przeciążoną wersję akceptującą za parametr taki interfejs, kompilator nie zgłosi zastrzeżeń.

Sortowanie kolekcji w języku Java malejąco

Zrzut ekranu prezentujący wypisanie pomyślnie posortowanych argumentów kolekcji "ArrayList" w kolejności malejącej.

NIE ZAWSZE BĘDZIE TAK ŁATWO...

Sortowanie kolekcji w języku Java w przypadku typów podstawowych takich jak "Integer", "Float" czy "Double" (tzw. "klasy opakowujące") jest dziecinne, aczkolwiek pojawia się spory problem przy kolekcjach typu klasowego. Pomyślmy przez chwilę. Możemy bez problemu sobie wyobrazić w jaki sposób posortować liczby, już nieważne jakie. Po prostu porównujemy jedną do drugiej i sprawdzamy która z nich jest większa lub mniejsza. Na podstawie takich weryfikacji obu liczb idąc od początku do końca kolekcji, mamy uporządkowanie.

Ale...klasa? Jak można posortować obiekty? Na podstawie czego? Ich nazwy? Adresów referencji? Wiem, ciężko to sobie wyobrazić zwłaszcza osobie, która styka się z tym po raz pierwszy. Tutaj samo wywołanie "Collections.sort" NIE WYSTARCZY. Dlaczego? A jak program ma sortować obiekty? Potrzebna jest definicja filtru albo kryterium, którym program będzie się sugerował przy sortowaniu kolekcji. Sortowanie kolekcji dla typu klasowego będzie zrealizowane tylko wówczas, gdy programista ściśle określi jakąś cechę na podstawie której aplikacja ma klasyfikować obiekty (który z nich ma być pierwszy, a który drugi).

Od razu możecie krzyczeć, że "jakoś przy typie całkowitoliczbowym nie musieliśmy tego robić". Prawda, ale to tylko dlatego, że "Integer" już posiada w sobie to "coś", które stanowi dla metody sortującej kryterium jakim ma się kierować. Sortowanie kolekcji w takim układzie odbywa się bezproblemowo, bo tam cecha została już określona.


W związku z powyższym, jawi się konkretne pytanie: jak możemy wprowadzić własny filtr sortowania dla typu dowolnej kolekcji w postaci własnej klasy? Nie chodzi mi o "sens" tego filtrowania tylko o zapis kodowy, czyli z jakich "części" języka należy skorzystać. Pomyślcie chwilę, a potem zapraszam do kolejnej części tego tematu.

PODOBNE ARTYKUŁY