Você está aqui: Java ::: Pacote java.util ::: Comparator |
Usando o método compare() da interface Comparator para definir como os elementos de uma coleção serão ordenadosQuantidade de visualizações: 4155 vezes |
O perfeito entendimento do método compare() da interface Comparator é a chave para conseguirmos um maior controle sobre a forma que os elementos de uma coleção (ArrayList, Vector, TreeSet, etc) serão ordenados. Este método possui a seguinte assinatura:int compare(T o1, T o2) Veja que o método recebe dois argumentos do tipo T e retorna um valor inteiro. O valor retornado será um inteiro negativo se o primeiro argumento for menor que o segundo, um inteiro positivo se o primeiro argumento for maior que o segundo e zero se os dois argumentos forem iguais. Vamos ver como isso funciona? Comece criando a seguinte classe: package estudos; public class Livro{ // para simplificar o exemplo não usarei encapsulamento de dados String titulo; int paginas; // construtor não padrão public Livro(String titulo, int paginas){ this.titulo = titulo; this.paginas = paginas; } } Veja que temos uma classe Livro com dois atributos: titulo e paginas. Nossa intenção é criar uma ArrayList de objetos da classe Livro e em seguida ordenar os livros pela quantidade de paginas, da menor para a maior. Eis o código para a classe principal: package estudos; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class Estudos{ public static void main(String[] args) { // vamos criar uma ArrayList de objetos da classe Livro ArrayList<Livro> livros = new ArrayList(); livros.add(new Livro("Programando em Java", 259)); livros.add(new Livro("A Bíblia do Delphi", 1043)); livros.add(new Livro("Aprenda PHP e MySQL", 427)); livros.add(new Livro("Tutorial Básico de JSF", 41)); // vamos ordenar os elementos do ArrayList usando o método sort() da classe Collections // o critério de ordenação é por paginas ascendente Collections.sort(livros, new Comparator<Livro>(){ @Override public int compare(Livro a, Livro b){ if(a.paginas < b.paginas){ // se a.paginas for menor que b.paginas devemos retornar um valor negativo return -1; } else if(a.paginas > b.paginas){ // se a.paginas for maior que b.paginas devemos retornar um valor positivo return 1; } else{ // os objetos são iguais....devemos retornar 0 return 0; } } }); // vamos percorrer e exibir os valores dos elementos for(Livro livro : livros){ System.out.println("Título: " + livro.titulo + "; Páginas: " + livro.paginas); } } } Ao executarmos este exemplo teremos o seguinte resultado: Título: Tutorial Básico de JSF; Páginas: 41 Título: Programando em Java; Páginas: 259 Título: Aprenda PHP e MySQL; Páginas: 427 Título: A Bíblia do Delphi; Páginas: 1043 Se quisermos modificar a ordem da classificação basta trocarmos os operadores relacionais. Há uma forma interessante de se evitar os testes condicionais no método compare(). Veja: // vamos ordenar os elementos do ArrayList usando o método sort() da classe Collectons // o critério de ordenação é por paginas ascendente Collections.sort(livros, new Comparator<Livro>(){ @Override public int compare(Livro a, Livro b){ return a.paginas - b.paginas; } }); Mas é claro que este truque só funciona para a classificação em ordem crescente. O método compare() da interface Comparator pode atirar duas exceções: NullPointerException se um dos argumentos for null e o comparador não permitir elementos nulos e ClassCastException se os tipos dos argumentos não permitirem a comparação. |
![]() |
Desafios, Exercícios e Algoritmos Resolvidos de Java |
Veja mais Dicas e truques de Java |
Dicas e truques de outras linguagens |
Java - Como usar null em Java |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |