Як реалізувати порівняний інтерфейс Java?


101

Я не впевнений, як реалізувати порівняльний інтерфейс у своєму абстрактному класі. У мене є такий приклад коду, який я використовую, щоб спробувати обійти його:

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

У мене є тестовий клас, який створюватиме об’єкти типу Animal, однак я хочу мати порівнянний інтерфейс всередині цього класу, щоб старші роки відкриття ставали вище, ніж низькі. Я навіть не маю уявлення, як з цим піти.


4
Подивіться на документацію для Comparable. Реалізуйте метод, про який він вам каже, так, як вам це каже.
Кайнарвон

3
Я переглянув документацію на Java та інші джерела, щоб спробувати обійти її, але я чомусь не розумію цього. Я знаю, що це щось просте, але це лише одна з цих речей.
Софтей

Дуже багато прикладів проводить порівняння поза класом, але я хочу це зробити всередині.
Софтей

3
Також розгляньте зміну назви змінної "year_discovered" на конвенцію Java на "yearDiscovered".
шторми

Я змінив рік_відкритий на рікЗнайдений. Страшні звички робити пітона самоучки. Дякую
Softey

Відповіді:


156

Ви просто повинні визначити це, Animal implements Comparable<Animal>тобто public class Animal implements Comparable<Animal>. І тоді ви повинні реалізувати compareTo(Animal other)метод так, як вам це подобається.

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

Використовуючи цю реалізацію compareTo, тварини з більшим year_discoveredнаказом будуть вище. Я сподіваюся, що ви зрозумієте Comparableі compareToз цим прикладом.


2
В Android itrequires API 19
Hamzeh Soboh

Альтернатива:return ((Integer)this.level).compareTo(other.level);
Hamzeh Soboh

36

Тобі потрібно:

  • Додати implements Comparable<Animal>до декларації класу; і
  • Реалізуйте int compareTo( Animal a )метод виконання порівнянь.

Подобається це:

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

Поки ви перебуваєте в ньому, я пропоную запам'ятати деякі основні факти щодо методів сравнениеTo ()

  1. CompareTo повинен відповідати методу рівних, наприклад, якщо два об'єкти рівні через рівняння (), параметр сравнениеTo () повинен повернути нуль інакше, якщо ці об’єкти зберігаються в SortedSet або SortedMap, вони не будуть вести себе належним чином.

  2. CompareTo () повинен кинути NullPointerException, якщо поточний об'єкт порівнюється з нульовим об'єктом, на відміну від рівного (), який повертає помилку в такому сценарії.

Детальніше: http://javarevisited.blogspot.com/2011/11/how-to-override-compareto-method-in.html#ixzz4B4EMGha3




0

Можлива альтернатива вихідного коду Integer.compareметоду, який вимагає API Version 19:

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

Ця альтернатива не вимагає від вас використання API version 19.


0

Клас Emp повинен реалізувати порівнянний інтерфейс, тому нам потрібно переосмислити його метод 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);
      }
    }

}

Я порівнюю це з ідентифікатором emp
Mahadev Mane

0

Ось код для реалізації 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

Використовуйте компаратор ...

    public class AnimalAgeComparator implements Comparator<Animal> {

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

1
ОП запитують Порівняння, а не порівняння
Абімаран Кугатхасан

Але я думаю, що в цьому випадку кращим рішенням є компаратор. Ви можете дати йому назву з порівнянням компаратора.
pL4Gu33

1
Єдина причина мати компаратор - це різні типи сортування. В іншому випадку зробити клас порівнянним є кращим рішенням, оскільки об’єкт є порівнянним, і його можна використовувати безпосередньо в мапі або будь-якій іншій колекції
Варган

-5

Цю річ можна легко зробити, застосувавши публічний клас, який реалізує Comparable. Це дозволить вам використовувати метод CompareTo, який можна використовувати з будь-яким іншим об'єктом, з яким ви хочете порівняти.

наприклад, ви можете реалізувати це таким чином:

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

Я думаю, що це може вирішити вашу мету.


3
Рядок не має порівняння
Кеннеді Няга

Ви повинні перевірити свій код, перш ніж вставити його сюди.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.