Інтерфейс 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
* Str: Nancy Summer
*/
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
Name: Tea 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);
Сортували за допомогою класу Arrays, у якого є метод sort. Даний метод в якості другого аргументу приймає тип компаратора.
Arrays.sort (T [ ] arg1, Comparator <? Super T> arg2);
Так само можна використовувати метод sort класу Collections, але він як перший вхідного аргументу приймає список:
Collections.sort (List <T> arg1, Comparator <? Super T> arg2);
equals (Object obj) - порівнює компаратори об'єктів. Перевизначається дуже рідко.