Póki co, postanowiłem uznać serię artykułów na temat wątków w Java za zakończoną. Gdyby trzeba było coś jeszcze dodać, to z pewnością później wprowadzę. Rzućmy teraz okiem na kolekcje. "ArrayList" nie trzeba nikomu przedstawiać, aczkolwiek co byście powiedzieli gdyby konieczne było sortowanie "ArrayList"? Jest możliwość posortowania najbardziej powszechnie stosowanej kolekcji bez stosowania żadnych skomplikowanych sztuczek (jak się później okaże, zależy jakiego typu są argumenty). Zapraszam do środka artykułu.

SORTOWANIE "ARRAYLIST" 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:

Collections.sort([kolekcja ArrayList]);

Zróbmy sobie przykładowy "ArrayList" przechowujący liczby całkowite. Dodajemy do niej parę liczb i chcemy je posortować 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 ArrayList<Integer> integers;

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

	private void createInstances()
	{
		integers = new ArrayList<>();
	}

	private void addNumbers()
	{
		integers.add(6);
		integers.add(-12);
		integers.add(743);
		integers.add(290);
		integers.add(-56);
		integers.add(7000);
	}

	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 "ArrayList". Dorzuciłem też 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ą wprowadzania do niej liczb, a drugi prezentuje posortowane argumenty w kolejności rosnącej.

Możemy też bez żadnych przeszkód wymusić sortowanie od największej do najmniejszej 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. "Collections.reverseOrder" zwraca tak zwany "Comparator". On jest przedmiotem innego artykułu.

Sortowanie ArrayList malejąco

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

Sortowanie "ArrayList" 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 "ArrayList" dla typu klasowego będzie zrealizowane tylko wówczas, gdy programista ściśle określi jakąś cechę na podstawie czego ma klasyfikować obiekty który z nich ma być pierwszy, a który nie.

Od razu możecie krzyczeć, że "jakoś przy "Integer" 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 "ArrayList" 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