TREEMAP e Comparator

Propaganda
TREEMAP<K, V> e Comparator<Ponto2D>
Pretendemos que a variável planoEsp seja agora um TreeMap<Ponto2D,Integer>. A classe
Ponto2D não tem sobre si definida qualquer ordem natural, pelo que necessitamos de definir
um método de comparação de pontos Ponto2D.
O construtor TreeMap<K,V>(Comparator<? super K> c) espera que lhe seja passado
como parâmetro um comparator de tipo K ou de um supertipo de K. No nosso caso, em que
pretendemos criar um TreeMap<Ponto2D,Integer>, temos pois que criar uma classe que
implemente a interface Comparator<Ponto2D>:
import java.util.Comparator;
import java.io.Serializable;
public class PontoComparator
implements Comparator<Ponto2D>, Serializable {
public int compare(Ponto2D p1, Ponto2D p2) {
if( p1.getX() < p2.getX() ) return -1;
if( p1.getX() > p2.getX() ) return 1;
if( p1.getY() < p2.getY() ) return -1;
else if(p1.getY() > p2.getY()) return 1; else return 0; }
}
A classe PontoComparator implementa a interface Comparator<Ponto2D> e ainda a interface Serializable, o que é de grande importância também, pois quando uma classe que
necessita de um comparador para organizar as suas chaves ou elementos é serializada, o
método de comparação deve poder sê-lo também, pois vai ser necessário na desserialização
e, portanto, faz parte integrante da classe que dele depende:
TreeMap<Ponto2D, Integer> planoEsp =
new TreeMap<Ponto2D, Integer>(new PontoComparator());
Apresentam-se a seguir alguns métodos da classe PlanoPesado que usa um treemap do tipo
<Ponto2D,Integer>.
public class PlanoPesado {
private TreeMap<Ponto2D, Integer> plano;
// Construtores
public PlanoPesado() {
plano = new TreeMap<Ponto2D, Integer>(new PontoComparator());
}
public PlanoPesado(Comparator<Ponto2D> cp) {
plano = new TreeMap<Ponto2D, Integer>(cp);
}
// Métodos de Instância
public void juntaPonto(Ponto2D p, int peso) { // usa unto-boxing
plano.put(p, peso);
}
public void remPonto(Ponto2D p) {
plano.remove(p);
}
public boolean existePonto(Ponto2D p) {
return plano.containsKey(p);
}
//
public TreeSet<Ponto2D> dom() { // cópia ordenada das chaves
TreeSet<Ponto2D> paux =
new TreeSet<Ponto2D>(new PontoComparator());
for(Ponto2D p : plano.keySet()) paux.add(p.clone());
return paux;
}
//
public HashSet<Ponto2D> chaves() {
HashSet<Ponto2D> paux = new HashSet<Ponto2D>();
for(Ponto2D p : plano.keySet()) paux.add(p.clone());
return paux;
}
}
A Figura 8.49 apresenta os resultados obtidos depois de se realizar uma iteração sobre as chaves
de TreeMap<Ponto2D,Integer>, mostrando que PontoComparator, o comparador de
pontos, realizou a comparação correcta dos pontos inseridos no treemap.
Download