Comparator

Olá pessoal,

Procurei sobre o assunto no forum e vi que se implementa o metodo compareTo da interface Comparable ou compare da interface Comparator, gostaria de entender melhor a chamada a esse métodos, são sempre explicitas como algun exemplos que vi no forum ?

Mesmo assim estou confuso quanto ao seguinte código:

[code]package com.exercise.whizlabs;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class Generics3 {

/**
 * @param args
 */
public static void main(String[] args) {
	Set<Employee> set = new TreeSet<Employee>(new MyComparator<Employee>()); //linha 15 <--- Nao entendi
	set.add(new Employee("Jacob",30));
	set.add(new Employee("George",29));
	set.add(new Employee("Daisy",40));
	set.add(new Employee("Daisy",22));		
	
	for (Employee e : set) {
		System.out.println(e);
	}
}

}

class Employee{
String name;
int age;

Employee(String name, int age){
	this.name = name;
	this.age = age;
}

String getName(){
	return name;		
}

int getAge(){
	return age;
}

public String toString(){
	return name + " of age " + age;
}

}

class MyComparator implements Comparator {
public int compare(T obj1, T obj2){
String name1 = obj1.getName();
String name2 = obj2.getName();

	if(!name1.equals(name2)){
		return name1.compareTo(name2);
	}
	else
		return obj1.age - obj2.age;
}

}[/code]

Nao vejo nenhuma chamada explícita ao compare da MyComparator e gostaria de entender como é feita essa chamada nesse codigo e também entender a linha 15, e porque nao funciona se reescrever a linha 15 para :

Pelo que entendi classes que TreeSet precisa que o objeto que você está inserindo implementa Comparable, ou que você passe para ela um Comparator, para ela ordernar os elementos durante a inserção, isso é feito implicitamente

Bom, antes de mais nada você precisa entender alguns outros conceitos:

Um TreeSet é um conjunto ordenado automaticamente, ou seja, sempre que você adiciona um elemento, ele será alocado em ordem. Mas qual ordem? Ai que entram os conceitos de Comparable e Compator, para você construir um TreeSet, os elementos devem ser comparáveis entre sí, para que o Java possa determinar a ordem de inserção.

Isso é feito de duas maneiras, com a classe explicitamente implementando Comparable (e provendo um método compareTo) ou usando um classe que implementa Comparator (provendo o método compare).

Quem vai chamar esses métodos é o próprio Java através da classe TreeSet, no momento da inserção, não é algo “visivel” no seu código.

Como a sua classe Employee não implementa Comparable, você não pode criar um TreeSet dela sem prover um Comparator, por isso na linha 15 você está passando este Comparator como argumento, e por isso se você alterar a linha la em baixo o código não vai funcionar, pois o Java não saberá como ordenar o seu TreeSet.

Mais afundo um pouco no seu código, o MyComparator aceita Employee ou qualquer filho dele (T Extends Employee), ou seja se você criar um SpecialEmployee, ele pode usar o mesmo Comparator.

Finalizando, uma classe pode implementar apenas uma vez Comparable (provendo assim somente uma forma de ordenação direto na classe), por isso existe Comparator, deste modo você pode criar quantos critérios de ordenação você quiser, por exemplo, ordenando por ordem alfabética pelo nome, pela idade, pelo salário, enfim, inúmeras possibilidades de ordenação para seu Employee através dos comparators. Um recurso muito utilizado na criação de Comparator é criá-los como classes internas da classe a qual este Comparator se refere, mas ai já é outro assunto :stuck_out_tongue:

Um exemplo de implementação de Comparable.

http://emdia.wordpress.com/2008/11/01/ordenando-uma-lista-de-objeto/