Jak zaimplementować porównywalny interfejs Java?

101

Nie jestem pewien, jak zaimplementować porównywalny interfejs do mojej klasy abstrakcyjnej. Mam następujący przykładowy kod, którego używam, aby go obejść:

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;
    }
}

Mam klasę testową, która utworzy obiekty typu Animal, jednak chcę mieć porównywalny interfejs wewnątrz tej klasy, aby starsze lata odkryć były wyższe niż niskie. Nie mam jednak pojęcia, jak się do tego zabrać.

Softey
źródło
4
Zapoznaj się z dokumentacją dotyczącą Comparable. Zaimplementuj metodę, o której ci mówi, w sposób, który ci nakazuje.
Cairnarvon,
3
Zajrzałem do dokumentacji Java i innych źródeł, aby spróbować to obejść, ale z jakiegoś powodu tego nie rozumiem. Wiem, że to coś prostego, ale to tylko jedna z tych rzeczy.
Softey
Wiele przykładów porównuje również poza klasą, ale chcę to zrobić wewnątrz.
Softey
3
Rozważ także zmianę nazwy zmiennej „year_discovered” na konwencję Java „yearDiscovered”.
burze
Zmieniłem year_discovered na yearDiscovered. Okropne nawyki wynikające z robienia pytona-samouka. Dziękuję
Softey,

Odpowiedzi:

156

Musisz tylko to zdefiniować Animal implements Comparable<Animal>tj public class Animal implements Comparable<Animal>. A potem musisz zaimplementować compareTo(Animal other)metodę tak, jak lubisz.

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

Korzystając z tej implementacji compareTo, zwierzęta z wyższą pozycją year_discoveredzostaną zamówione wyżej. Mam nadzieję, że masz pomysł Comparablei compareToz tego przykładu.

user1983983
źródło
2
W Android itrequires API 19
Hamzeh Soboh
Alternatywą jest:return ((Integer)this.level).compareTo(other.level);
Hamzeh Soboh
36

Musisz:

  • Dodaj implements Comparable<Animal>do deklaracji klasy; i
  • Zaimplementuj int compareTo( Animal a )metodę wykonywania porównań.

Lubię to:

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);
    }
}
MT0
źródło
6

Skoro już to robisz, proponuję przypomnieć sobie kilka kluczowych faktów na temat metod compareTo ()

  1. CompareTo musi być spójny z metodą equals, np. Jeśli dwa obiekty są równe za pomocą equals (), funkcja CompareTo () musi zwracać zero, w przeciwnym razie, jeśli te obiekty są przechowywane w SortedSet lub SortedMap, nie będą się zachowywać poprawnie.

  2. CompareTo () musi zgłosić wyjątek NullPointerException, jeśli bieżący obiekt zostanie porównany z obiektem null, w przeciwieństwie do equals (), które w takim scenariuszu zwracają false.

Czytaj więcej: http://javarevisited.blogspot.com/2011/11/how-to-override-compareto-method-in.html#ixzz4B4EMGha3

Gość
źródło
1

Zaimplementuj Comparable<Animal>interfejs w swojej klasie i zapewnij implementację int compareTo(Animal other)metody w swojej klasie. Zobacz ten post

Sanjeev
źródło
0

Możliwa alternatywa dla kodu źródłowego Integer.comparemetody, która wymaga API Version 19:

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

Ta alternatywa nie wymaga użycia API version 19.

recepinanc
źródło
0

Klasa Emp musi zaimplementować interfejs Comaparable, więc musimy zastąpić jej metodę 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);
      }
    }

}
Mahadev Mane
źródło
Porównuję to z emp id
Mahadev Mane
0

Oto kod implementujący porównywalny interfejs 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);
    }
}
siedmiodniowa żałoba
źródło
-1

Użyj komparatora ...

    public class AnimalAgeComparator implements Comparator<Animal> {

@Override
public int compare(Animal a1, Animal a2) {
  ...
}
}
pL4Gu33
źródło
1
OP pyta Porównywalny, nie Komparator
Abimaran Kugathasan
Ale myślę, że w tym przypadku komparator jest lepszym rozwiązaniem. Możesz nadać mu nazwę, którą porównuje.
pL4Gu33
1
Jedynym powodem posiadania komparatora jest posiadanie różnych typów sortowania. W przeciwnym razie zapewnienie porównywalności klasy jest lepszym rozwiązaniem, ponieważ obiekt jest porównywalny i można go użyć bezpośrednio w mapie drzewa lub dowolnej innej kolekcji
Vargan
-5

Można to łatwo zrobić, implementując publiczną klasę, która implementuje Comparable. Umożliwi to użycie metody compareTo, której można użyć z dowolnym innym obiektem, z którym chcesz porównać.

na przykład możesz to zaimplementować w ten sposób:

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

Myślę, że to może rozwiązać twój cel.

D3X
źródło
3
String nie ma porównania
Kennedy Nyaga
Powinieneś przetestować swój kod, zanim wkleisz go tutaj.