Назад Зміст Вперед

8.4. Інтерфейс Comparable

Інтерфейс Comparable

В інтерфейсі Comparator оголошено два методи 
compare (Object obj1, Object obj2) і 
equals (Object obj).

compare (Object obj1, Object obj2) - так само, як і метод compareTo інтерфейсу Comparable, впорядковує об'єкти класу. Так само на виході отримує 0, 1 і -1.
Метод може викинути виняток ClassCastException, якщо типи об'єктів не сумісні при порівнянні.
Основною відмінністю інтерфейсу Comparator від Comparable є те, що ви можете створювати декілька видів незалежних угруповань.
Приклад реалізації інтерфейсу.

package my.value;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
class Comp implements Comparator<String> {
  
       @Override
       public int compare(String obj1, String obj2) {
             // пошук пробілів для сортування за прізвищем
             int k = obj1.substring(obj1.indexOf(" "))
.compareTo(obj2.substring(obj2.indexOf(" ")));
             if(k == 0) {
                    return obj1.compareTo(obj2);
             }
             else {
                    return k;
             }
       }
}
public class Example {
      
       public static void main(String[] args) {
             TreeSet<String> ex = new TreeSet<String>(new Comp());
             ex.add(new String("Stive Global"));
             ex.add(new String("Stive Cooper"));
             ex.add(new String("Nancy Summer"));
             ex.add(new String("Aaron Eagle"));
             ex.add(new String("Barbara Smith"));
            
             Iterator<String> i = ex.iterator();
            
             while(i.hasNext()) {
                    String ts = i.next();
                    System.out.println("Str: " + ts);
             }
       }
}
/* результат:
* Str: Stive Cooper
* Str: Aaron Eagle
* Str: Stive Global
* Str: Barbara Smith
StrNancy Summer
*/

Давайте ускладнимо ситуацію і створимо клас Product з полями name, price і quantity. В даному класі буде реалізовано два види сортування: за назвою і за ціною.
package my.value;

import java.util.Arrays;
import java.util.Comparator;
// створення об'єкту для зберігання даних
class Product {
       private String name;
       private double price;
       private int quantity;
      
       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 getQuantity() {
             return quantity;
       }
       public void setQuantity(int quantity) {
             this.quantity = quantity;
       }
}

// тепер реалізуємо інтерфейс Comparator, для сортування за назвою
class SortedByName implements Comparator<Product> {
      
       public int compare(Product obj1, Product obj2) {
            
             String str1 = obj1.getName();
             String str2 = obj2.getName();
            
             return str1.compareTo(str2);
       }
}

// а також реалізуємо інтерфейс Comparator, для сортування за ціною
class SortedByPrice implements Comparator<Product> {
      
       public int compare(Product obj1, Product obj2) {
            
             double price1 = obj1.getPrice();
             double price2 = obj2.getPrice();

             if(price1 > price2) {
                    return 1;
             }
             else if(price1 < price2) {
                    return -1;
             }
             else {
                    return 0;
             }
       }
}

// робота з даними
public class Example {
      
       public static void main(String[] args) {
             Product[] p = new Product[3];
            
             // заповнення об'єкту Product
             p[0] = new Product();
             p[0].setName("Milk");
             p[0].setPrice(7.56);
             p[0].setQuantity(56);
            
             p[1] = new Product();
             p[1].setName("Coffee");
             p[1].setPrice(17.00);
             p[1].setQuantity(32);
            
             p[2] = new Product();
             p[2].setName("Tea");
             p[2].setPrice(12.50);
             p[2].setQuantity(0);
            
             // виведення даних без сортування
             System.out.println("============ no sorted ==============");
            
             for(Product i : p) {
                    System.out.println("Name: " + i.getName() +
                                        " price: " + i.getPrice() +
" quantity: " + i.getQuantity());
             }
            
             // відсортувати і вивести дані за ціною
             System.out.println("========== sorted by price===========");

             Arrays.sort(p, new SortedByPrice());
            
             for(Product i : p) {
                    System.out.println("Name: " + i.getName() +
                                        " price: " + i.getPrice() +
" quantity: " + i.getQuantity());
             }     

              // відсортовані і вивести дані за назвою
             System.out.println("========== sorted by name ===========");
            
             Arrays.sort(p, new SortedByName());
             for(Product i : p) {
                    System.out.println("Name: " + i.getName() +
                                        " price: " + i.getPrice() +
" quantity: " + i.getQuantity());
             }
       }
}
/* результат:
============ no sorted ==============
Name: Milk price: 7.56 quantity: 56
Name: Coffee price: 17.0 quantity: 32
Name: Tea price: 12.5 quantity: 0
========== sorted by price===========
Name: Milk price: 7.56 quantity: 56
Name: Tea price: 12.5 quantity: 0
Name: Coffee price: 17.0 quantity: 32
========== sorted by name ===========
Name: Coffee price: 17.0 quantity: 32
Name: Milk price: 7.56 quantity: 56
NameTea price: 12.5 quantity: 0
*/

У чому перевага цього прикладу? Як ви, можливо, помітили, було реалізовано два незалежних компаратора -SortedByName і SortedByPrice.

Сортували за допомогою класу Arrays, у якого є метод sort. Даний метод в якості другого аргументу приймає тип компаратора.

Arrays.sort (T [ ] arg1, Comparator <? Super T> arg2);

Так само можна використовувати метод sort класу Collections, але він як перший вхідного аргументу приймає список:

Collections.sort (List <T> arg1, Comparator <? Super T> arg2);

equals (Object obj) - порівнює компаратори об'єктів. Перевизначається дуже рідко.
.