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.