Programação Java: Como comparar objetos Classe abstrata Comparable e o método compareTo

Linguagem Java , Programação Java, Java Curso gratis. No tutorial passado de nossa apostila de Java , falamos sobre as Interfaces em Java , que fazem uso de diversos conceitos de Orientação a Objetos que estamos estudando, como Polimorfismo e Classes e Métodos Abstratos .

Como de praxe, iremos ensinar mais uma lição de Java englobando diversos assuntos.
Hoje vamos aprender como comparar objetos (maior, menor, igual etc), e para isso faremos uso da classe abstrata Comparable e de seu método compareTo( ).

E para ver uma utilidade prática desses assuntos, vamos mostrar um exemplo através da ordenação de elementos de um Array .

  • Obtenha seu certificado e trabalhe como programador Java!

Comparando objetos em Java

Como se compara uma coisa com outra?
Analisamos uma característica que deve ser mensurável.
Por exemplo, para comparar dois números, fazemos uso de seus valores.

Mas poderíamos comparar o nome deles, através da ordem alfabética.
Embora 1 seja maior que 2 na comparação de seus valores, “um” é maior que “dois”, pois a letra “u” vem depois da letra “b”.
Ou seja, não faz sentido comparar duas coisas, e sim duas características específicas e mensuráveis.

Por exemplo, não se compara banana com maçã.
Mas podemos comparar o tanto de vitaminas em cada uma delas, ou seu peso, pois são características mensuráveis.

E objetos? Como comparamos um objeto?
Como comparo um objeto “secretário” com o objeto “gerente”, ambos a classe “Funcionários” de uma empresa?

Se tiver captado a ideia, verá que não dá pra se comparar assim.
Mas podemos comparar uma características específica de cada objeto, como o salário de cada funcionário, ou a data de entrada na empresa ou seus números de identificação.

Portanto, quem vai comparar é que escolhe como vai ser a comparação.

<

table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;"> A classe abstrata Comparable e o método compareTo()

Existe uma classe especial em Java que é responsável por fazer comparações de objetos, que é a classe Comparable. Ela usada como padrão de comparação.
Por exemplo, vimos em nossos tutoriais sobre Arrays que existe um método chamado sort(), que ordena os elementos de um Array, do menor para o maior.

Porém, como explicamos no tópico passado, não se compara coisas genéricas, como objetos, e sim coisas específicas, que podem ter seus valores medidos.
Ora, se não dá pra comparar, como a classe Comparable serve para comparar?

Se eu quiser comparar um carro com outro, através da classe Comparable, o que ela vai comparar, então?
A resposta está no tutorial passado, sobre classes e métodos abstratos: ela serve para comparar qualquer coisa, mas nada em específico.

Essa comparação é feita através do método compareTo(Object o), que recebe um objeto (se lembre que todos os objeto são derivados da classe Object, logo, todo e qualquer objeto que é possível criar em Java é derivado de Object).

Esse método retorna 3 números: -1, 0 ou 1.
Vamos supor que temos um objeto “X” e queremos comparar com o objeto “Y”.
Usamos esse método assim: X.compareTo(Y)

Caso “X” seja maior que “Y”, o método retorna 1.
Caso “X” seja menor que “Y”, o método retorna -1.
Caso “X” seja igual à “Y”, o método retorna 0.

Ok. Já sabemos que essa classe compara objetos, e que o método retorna o valor dessa comparação (-1, 0 ou 1). Mas O QUÊ e COMO essa classe e esse método comparam?
Que característica do objeto?

Ela não diz, pois não pode adivinhar o que raios você vai querer comparar.
Então é você que vai escolher, que característica do objeto comparar.
Ou seja, você vai implementar a comparação.

Implementar, isso te lembra algo? Sim, implements.
A classe Comparable está lá, com seu método compareTo(), declarados e prontos para serem usados.
Mas a maneira que é feita essa comparação, você programador Java que decide.

Vamos criar um exemplo para você ver melhor como as coisas funcionam!

Exemplo de código Comparando Objetos

Crie diversos objetos do tipo “Carro”, onde eles tem um nome e um ano de fabricação.
Coloque esses carros em um Array, e usando o método sort, ordene esses objetos de modo a imprimir a lista de nomes e carros, ordenada por ano de fabricação do carro, do mais antigo para o mais novo.

Primeiramente, vamos criar a classe “Carro”.
Ela é bem simples, tem dois atributos: o “nome” do carro e seu “ano”, bem como seus métodos getters.

Porém, vamos querer comparar objetos dessa classe.
Logo, os objetos tem que se ‘comparáveis’ em Java, e para isso, basta fazer com que a classe “Carro” seja um implemento (implements) da interface “Comparable”:
public class Carro implements Comparable{
}

Bom, mas essa classe abstrata tem o método compareTo, que recebe um objeto.
E como todo método de uma classe abstrata, esse método DEVE ser implementado!

Como explicamos, ele tem que retornar um inteiro.
Se quiser usar ele junto com outras funcionalidades do Java, você deve fazer isso de modo que, ao comparar um objeto “X” com um método “Y”, tenhamos que fazer: X.compareTo(Y)

E, como já havíamos dito, devemos fazer:

  • Caso “X” seja maior que “Y”, o método retorna 1.
  • Caso “X” seja menor que “Y”, o método retorna -1.
  • Caso “X” seja igual à “Y”, o método retorna 0. 

    public class Carro implements Comparable{
    private int ano=;
    private String nome;

    public Carro(int ano, String nome){
    this.ano = ano;
    this.nome = nome;
    }

    public int compareTo(Object o){
    Carro car = (Carro) o;

    if(getAno() > car.getAno()){
    return 1;
    }else{
    if(getAno() car.getAno()){
    return -1;
    }else{
    return ;
    }
    }
    }


    public int getAno(){
    return this.ano;
    }

    public String getNome(){
    return this.nome;
    }
    }

import java.util.Arrays;

public class classeComparable {

public static void main(String[] args) {
Carro[] carros = {new Carro(1974, "Fusca"),
new Carro(2014, "Hilux"),
new Carro(2000, "Uno"),
new Carro(1998, "Gol")};


Arrays.sort(carros);
for(Carro car : carros)
System.out.println(car.getNome() + "\t" + car.getAno());

}

}

1974

        1998

        2000

        2014

Tags: java, linguagem java