Como implementar a interface comparável Java?


101

Não tenho certeza de como implementar uma interface comparável em minha classe abstrata. Tenho o seguinte código de exemplo que estou usando para tentar entender:

public class Animal{
    public String name;
    public int yearDiscovered;
    public String population;

    public Animal(String name, int yearDiscovered, String population){
        this.name = name;
        this.yearDiscovered = yearDiscovered;
        this.population = population; }

    public String toString(){
        String s = "Animal name: "+ name+"\nYear Discovered: "+yearDiscovered+"\nPopulation: "+population;
        return s;
    }
}

Eu tenho uma classe de teste que criará objetos do tipo Animal, no entanto, quero ter uma interface comparável dentro desta classe para que os anos de descoberta mais antigos sejam classificados acima do baixo. Não tenho ideia de como fazer isso.


4
Consulte a documentação do Comparable. Implemente o método que ele indica da maneira que ele instrui.
Cairnarvon

3
Dei uma olhada na documentação do Java e em outras fontes para tentar entender, mas por algum motivo não entendo. Eu sei que é algo simples, mas é apenas uma daquelas coisas.
Softey

Muitos exemplos também fazem a comparação fora da classe, mas eu quero fazer isso dentro.
Softey

3
Considere também alterar o nome da variável "year_discovered" para a convenção java "yearDiscovered".
tempestades de

Mudei year_discovered para yearDiscovered. Hábitos terríveis de fazer python autodidata. Obrigado
Softey

Respostas:


156

Você apenas tem que definir isso Animal implements Comparable<Animal>ou seja public class Animal implements Comparable<Animal>. E então você tem que implementar o compareTo(Animal other)método da maneira que você gosta.

@Override
public int compareTo(Animal other) {
    return Integer.compare(this.year_discovered, other.year_discovered);
}

Usando esta implementação de compareTo, os animais com uma ordem superior year_discoveredreceberão ordens superiores. Espero que você tenha uma ideia Comparablee compareTocom este exemplo.


2
No Android itrequires API 19
Hamzeh Soboh

A alternativa é:return ((Integer)this.level).compareTo(other.level);
Hamzeh Soboh

36

Você precisa:

  • Adicione implements Comparable<Animal>à declaração da classe; e
  • Implemente um int compareTo( Animal a )método para realizar as comparações.

Como isso:

public class Animal implements Comparable<Animal>{
    public String name;
    public int year_discovered; 
    public String population; 

    public Animal(String name, int year_discovered, String population){
        this.name = name;
        this.year_discovered = year_discovered;
        this.population = population;
    }

    public String toString(){
     String s = "Animal name: "+ name+"\nYear Discovered: "+year_discovered+"\nPopulation: "+population;
     return s;
    }

    @Override
    public int compareTo( final Animal o) {
        return Integer.compare(this.year_discovered, o.year_discovered);
    }
}

6

Enquanto você estiver nele, sugiro lembrar alguns fatos importantes sobre os métodos compareTo ()

  1. CompareTo deve ser consistente com o método equals, por exemplo, se dois objetos são iguais via equals (), compareTo () deve retornar zero, caso contrário, se esses objetos estiverem armazenados em SortedSet ou SortedMap, eles não se comportarão corretamente.

  2. CompareTo () deve lançar NullPointerException se o objeto atual for comparado ao objeto nulo em oposição a equals () que retorna falso em tal cenário.

Leia mais: http://javarevisited.blogspot.com/2011/11/how-to-override-compareto-method-in.html#ixzz4B4EMGha3


1

Implemente Comparable<Animal>interface em sua classe e forneça implementação de int compareTo(Animal other)método em sua classe. Veja esta postagem



0

A alternativa possível do código-fonte do Integer.comparemétodo que requer API Version 19é:

public int compareTo(Animal other) { return Integer.valueOf(this.year_discovered).compareTo(other.year_discovered); }

Esta alternativa não requer que você use API version 19.


0

A classe Emp precisa implementar a interface Comaparable, portanto, precisamos substituir seu método compateTo.

import java.util.ArrayList;
import java.util.Collections;


class Emp implements Comparable< Emp >{

    int empid;
    String name;

    Emp(int empid,String name){
         this.empid = empid;  
         this.name = name;

    }


    @Override
    public String toString(){
        return empid+" "+name;
    }

    @Override
    public int compareTo(Emp o) {

     if(this.empid==o.empid){
       return 0; 
     } 
     else if(this.empid < o.empid){
     return 1;
     }
     else{
       return -1;
     }
    }
}

public class JavaApplication1 {


    public static void main(String[] args) {

    ArrayList<Emp> a= new ArrayList<Emp>();

    a.add(new Emp(10,"Mahadev"));
      a.add(new Emp(50,"Ashish"));
      a.add(new Emp(40,"Amit"));
      Collections.sort(a);
      for(Emp id:a){
      System.out.println(id);
      }
    }

}

Estou comparando isso com emp id
Mahadev Mane

0

Aqui está o código para implementar a interface comparável Java,

// adding implements comparable to class declaration
public class Animal implements Comparable<Animal>
{
    public String name;
    public int yearDiscovered;
    public String population;

    public Animal(String name, int yearDiscovered, String population)
    {
        this.name = name;
        this.yearDiscovered = yearDiscovered;
        this.population = population; 
    }

    public String toString()
    {
        String s = "Animal name : " + name + "\nYear Discovered : " + yearDiscovered + "\nPopulation: " + population;
        return s;
    }

    @Override
    public int compareTo(Animal other)  // compareTo method performs the comparisons 
    {
        return Integer.compare(this.year_discovered, other.year_discovered);
    }
}

-1

Use um comparador ...

    public class AnimalAgeComparator implements Comparator<Animal> {

@Override
public int compare(Animal a1, Animal a2) {
  ...
}
}

1
OP pedindo Comparável, não Comparador
Abimaran Kugathasan

Mas acho que, neste caso, um comparador é a melhor solução. Você pode dar a ele um nome que o comparador compara.
pL4Gu33

1
A única razão para ter um comparador é ter diferentes tipos de classificação. Caso contrário, tornar a classe comparável é uma solução melhor porque o objeto é comparável e pode ser usado em um mapa de árvore ou qualquer outra coleção diretamente
Vargan

-5

Isso pode ser feito facilmente implementando uma classe pública que implementa Comparable. Isso permitirá que você use o método compareTo, que pode ser usado com qualquer outro objeto ao qual você deseja comparar.

por exemplo, você pode implementá-lo desta forma:

public String compareTo(Animal oth) 
{
    return String.compare(this.population, oth.population);
}

Acho que isso pode resolver seu propósito.


3
String não tem comparação
Kennedy Nyaga

Você deve testar seu código antes de colá-lo aqui.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.