неділю, 19 квітня 2020 р.

Клас TreeSet (Java)

Клас TreeSet дозволяє створювати відсортовану множину. Тобто елементи не повторюються та зберігаються у відсортованому порядку. Для зберігання елементів застосовується бінарна деревоподібну структура. Об'єкти зберігаються в відсортованому порядку по зростанню. Час доступу та одержання елементів доволі малий, тому клас TreeSet підходить для зберігання великих об’ємів відсортованих даних, які повинні бути швидко знайдені.

Клас TreeSet розширює клас AbstractSet та реалізує інтерфейс NavigableSet. NavigableSet реалізується на базі TreeMap.

В класі доступні чотири конструктори:

TreeSet () 
TreeSet(Collection  с) 
TreeSet(Comparator  компаратор) 
TreeSet(SortedSet  ss)
Третій конструктор дозволяє задавати власний компаратор, відповідно до якого буде відбуватися сортування об’єктів. Так об’єкти класу String не потребують реалізації власного компаратора, проте якщо ви хочете зберігати в класі TreeSet розроблені вами об’єкти, то потрібно задавати компаратор для цих об’єктів. Такий компаратор може реалізовувати сортування об’єктів по певному полю, наприклад по Прізвищу, якщо ваш клас зберігаю інформацію про осіб. Можна реалізувати ланцюжок компараторів з використанням методу thenComparing() класу Comparator.

TreeSet не може містити значення null. Також TreeSet не синхронізований клас, як і інші класи колекцій при потребі його потрібно синхронізувати з використанням методу Collections.synchronizedSet().

Розглянемо приклад роботи TreeSet з компаратором. Використаємо клас Car, який був попередньо використаний при роботі з LinkedList додавши лише гетер та сетер методи.
public class Car {
   private String name;
   private double price;
   private int year;
   public Car(String name, double price, int year) {
    this.name = name;
    this.price = price;
    this.year=year;
   }
   public String getName() {
    return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   public double getPrice() {
       return price;
   }
   public void setPrice(double price) {
       this.price = price;
   }
   public int getYear() {
       return year;
   }
   public void setYear(int year) {
       this.year = year;
   }
   
   @Override
   public String toString() {
     return "\n Car [name=" + name + ", price=" + price + ", year=" + year+ "]";
   }

}

Клас компаратора CarsComparator виглядає так:
import java.util.Comparator;
public class CarsComparator implements Comparator { 
        @Override
        public int compare(Car car1, Car car2) {
            if(car1.getYear() > car2.getYear())
                return 1;
            else if (car1.getYear() < car2.getYear())
                return -1;
            else return 0;
        }
 
}
Наша програма з TreeSet:
import java.util.Comparator;
import java.util.TreeSet;


public class  TestTreeSet{
    CarsComparator comp=new CarsComparator();
    TreeSet<Car> ts1=new TreeSet<>(comp);
    
    public static void main(String[] args) {
        TestTreeSet t=new TestTreeSet();
        t.test();  
    }
    void test(){
     Car car1=new Car("Ferrary", 12000, 1988);
        Car car2=new Car("Ford", 13000, 1955);
        Car car3=new Car("Toyota", 13500, 2003);
        Car car4=new Car("Citroen", 12000, 2014);
        Car car5=new Car("Mercedes-Benz", 15000, 2011);
        ts1.add(car1);
        ts1.add(car2);
        ts1.add(car3);
        ts1.add(car4);
        ts1.add(car5);
        System.out.println("Сортування по роках: "+ts1);
        //Зворотній компаратор для TreeSet(Java8)
        TreeSet<Car> ts2=new TreeSet<>(comp.reversed());   
        ts2.addAll(ts1); //додати вміст попереднього TreeSet у новий
        System.out.println("Зворотнє сортування:"+ts2);
     }

}

Результат виконання:
Сортування по роках: [
 Car [name=Ford, price=13000.0, year=1955], 
 Car [name=Ferrary, price=12000.0, year=1988], 
 Car [name=Toyota, price=13500.0, year=2003], 
 Car [name=Mercedes-Benz, price=15000.0, year=2011], 
 Car [name=Citroen, price=12000.0, year=2014]]
Зворотнє сортування:[
 Car [name=Citroen, price=12000.0, year=2014], 
 Car [name=Mercedes-Benz, price=15000.0, year=2011], 
 Car [name=Toyota, price=13500.0, year=2003], 
 Car [name=Ferrary, price=12000.0, year=1988], 
 Car [name=Ford, price=13000.0, year=1955]]
Реалізація інтерфейсу NavigableSet забезпечила клас TreeSet доволі корисними методами як то ceiling(), floor(), headset(), higher(), pollFirst(), pollLast(), subset(), tailSet(), iterator(), descendingIterator(), descendingSet(). Використовуючи їх можна організувати доволі зручний вибір елементів з TreeSet. Див. детальніше документацію по TreeSet.

Немає коментарів:

Дописати коментар