Jesteście zainteresowani jakie inne kolekcje występują w Javie? OK, zdecydowana większość problemów może zostać rozwiązana za pomocą "ArrayList", natomiast są też takie, które okażą się o wiele skuteczniejsze albo chociaż zaoszczędzą trochę pisania ze względu na ich niektóre działania wykonywane automatycznie. A skoro o automatycznych działania mowa, to obejrzymy sobie kolekcję "TreeSet" i porównamy sobie z poprzednim "książkowym" przykładem.

TREESET. KOLEKCJA IDEALNA DO ZADAŃ SORTOWANIA

Nie bez przyczyny powołam się na ten sam przykład. Moim zdaniem, najlepiej uwypuklać pewne zalety jak się obie strony postawi obok siebie i się porówna. "ArrayList" jak najbardziej można poddać sortowaniu, ale to nie należy do jej głównych zastosowań. Najbardziej powszechna kolekcja powinna być wykorzystywana jedynie do przechowywania wielu elementów zwracając uwagę na ich kolejność dodania do kolekcji.

"TreeSet" okaże się lepszym "zawodnikiem" jeśli chodzi o elementy, które mają być posortowane według ustalonego przez nas kryterium. Jest jedna bardzo ważna jej cecha której trzeba być świadom: sortowanie odbywa się automatycznie za każdym razem gdy zostanie dodany nowy element! Do podstawowych zadań "ArrayList" nie należy sortowanie więc trzeba to robić ręcznie wywołując statyczną metodę "sort" z klasy "Collections". Zaleta godna zwrócenia uwagi.

Jest coś jeszcze. Do tytułowej kolekcji nie wstawi się dwóch takich samych obiektów! Co konkretnie sprawia oraz kiedy możemy powiedzieć, że dwa obiekty są sobie "równe" jest odrębną debatą w tym artykule. Powodem jest to, że kolekcja pochodzi od rodzaju zwanego "Set". Po polsku to jest zbiór. Gdy mamy do czynienia ze zbiorem, to musimy wiedzieć, że jego podstawową cechą jest unikatowość elementów. Jeden z artykułów ukaże wszystkie trzy typy kolekcji razem z ich najlepszymi przykładami zastosowań.

Oprócz tego wszystkiego, nowo poznana kolekcja zwraca uwagę na to, czy nasza klasa implementuje interfejs "Comparable". Jeśli klasa go nie ma, to "TreeSetnie dopuści do kompilacji!

Kolekcja "TreeSet" w Javie

"TreeSet" jest kolekcją stworzoną do zadań wymagających przechowywania unikatowych elementów w odpowiedniej kolejności wg ustalonego kryterium. Ponadto WYMAGA ona implementacji interfejsu "Comparable".

PRZYKŁAD KODU ŹRÓDŁOWEGO

Zobaczmy szybko co nam daje "TreeSet" na tym samym przykładzie. Czy potraficie dostrzec różnice porównując to do "ArrayList"?

  • KLASA "Main"
public class Main
{
	public static void main(String[] args)
	{
		new Launcher();
	}
}
  • KLASA "Book"
public class Book implements Comparable<Book>
{
	private final String title, author, publisher;
	private final int year;

	public Book(String author, String title, String publisher, int year)
	{
		this.author = author;
		this.title = title;
		this.publisher = publisher;
		this.year = year;
	}

	@Override
	public String toString()
	{
		return author + ". " + title + ". " + publisher + ", " + year;
	}

	@Override
	public int compareTo(Book book)
	{
		return year - book.year;
	}
}
  • KLASA "Launcher"
import java. util.TreeSet;

public class Launcher
{
	private TreeSet<Book> books;

	public Launcher()
	{
		createInstances();
		addBooks();
		printBooks();
	}

	private void createInstances()
	{
		books = new TreeSet<>();
	}

	private void addBooks()
	{
		books.add(new Book("Adam Mickiewicz", "Pan Tadeusz", "Aleksander Jełowicki", 1834));
		printBooks();
		books.add(new Book("Gustaw Herling-Grudziński", "Inny świat", "Roy", 1951));
		books.add(new Book("Adam Mickiewicz", "Pan Tadeusz", "Aleksander Jełowicki", 1834));
		printBooks();
		books.add(new Book("Aleksander Głowacki", "Lalka", "Gebethner i Wolff", 1890));
	}

	private void printBooks()
	{
		System.out.println("WYPISYWANIE KOLEKCJI:");
		books.forEach(System.out::println);
	}
}

Zwracam Waszą uwagę na metodę "addBooks". Zawarłem tam celowo dodanie tej samej książki, aby poddać "TreeSet" próbie. Jak uruchomicie sobie program, zobaczycie, że kolekcja nie doprowadzi do wstawienia tego samego elementu. Tylko uprzedzam: "równość" obiektów wymaga dużo szerszego wyjaśnienia kiedy naprawdę to działa jak powinno (zapraszam tutaj). W chwili obecnej to jest "dziurawe" i od razu możecie się sami przekonać zmieniając jedynie rok wydania książki, nawet jeśli cała reszta parametrów konstruktora jest taka sama.


Na tym artykuł się kończy. Uwierzcie mi, istnieje wiele innych kolekcji, które mogą okazać się efektywniejsze od "ArrayList", nawet jeżeli jest możliwe rozwiązanie za pomocą najbardziej uniwersalnej listy. Ale czy nie lepiej poznać różne warianty i dzięki temu pisać lepszy kod?

PODOBNE ARTYKUŁY