Jason. Cała informatyka w jednym miejscu!

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 niektóre działania wykonywane automatycznie. A skoro o automatycznych działaniach mowa, to obejrzymy sobie kolekcję "TreeSet" w języku Java i porównamy sobie z poprzednim "książkowym" przykładem.

"TREESET" W JĘZYKU JAVA. KOLEKCJA IDEALNA DO 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 i w sposób niekonwencjonalny. 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 przechowywanie unikatowych elementów. Oprócz tego wszystkiego, nowo poznana kolekcja zwraca uwagę na to, czy nasza klasa implementuje interfejs "Comparable". Jeśli klasa go nie ma, to "TreeSet" w języku Java nie dopuści do kompilacji!

"TreeSet" w języku Java

"TreeSet" w języku Java jest zbiorem stworzonym do przechowywania unikatowych elementów w odpowiedniej kolejności według ustalonego kryterium. Ponadto WYMAGA ona implementacji interfejsu "Comparable".

PRZYKŁAD KODU ŹRÓDŁOWEGO

Zobaczmy szybko co nam daje "TreeSet" w języku Java 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 final TreeSet<Book> books = new TreeSet<>();

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

	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ę dodającą książki. Zawarłem tam celowo dodanie tych samych elementów, aby poddać "TreeSet" w języku Java 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. 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. To dlatego, że nie zdefiniowano warunku ustalającego ostatecznie czy obiekt powinien zostać "wpuszczony" do zbioru.


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 (choć nie zawsze jest). Ale czy nie lepiej poznać różne warianty i dzięki temu pisać lepszy kod?

PODOBNE ARTYKUŁY