Как реализовать интерфейс, сопоставимый с 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. Реализуйте метод, который он вам говорит, так, как он вам говорит.
Cairnarvon
3
Я просмотрел документацию по Java для него и другие источники, чтобы попытаться понять это, но по какой-то причине я этого не понимаю. Я знаю, что это что-то простое, но это одна из тех вещей.
Softey
Многие примеры также проводят сравнение вне класса, но я хочу сделать это внутри.
Softey
3
Также рассмотрите возможность изменения имени переменной "year_discovered" на соглашение Java "yearDiscovered".
tstorms
Я изменил year_discovered на 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с этим примером.

user1983983
источник
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);
    }
}
MT0
источник
6

Пока вы в нем, я предлагаю вспомнить некоторые ключевые факты о методах compareTo ()

  1. CompareTo должен согласовываться с методом equals, например, если два объекта равны через equals (), compareTo () должен возвращать ноль, в противном случае, если эти объекты хранятся в SortedSet или SortedMap, они не будут вести себя должным образом.

  2. CompareTo () должен генерировать исключение NullPointerException, если текущий объект сравнивается с нулевым объектом, а не с equals (), которые возвращают false в таком сценарии.

Подробнее: http://javarevisited.blogspot.com/2011/11/how-to-override-compareto-method-in.html#ixzz4B4EMGha3

гость
источник
1

Реализуйте Comparable<Animal>интерфейс в своем классе и обеспечьте реализацию int compareTo(Animal other)метода в своем классе. Посмотреть этот пост

Санджив
источник
0

Возможная альтернатива из исходного кода Integer.compareметода, который требует API Version 19:

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

Эта альтернатива не требует от вас использования API version 19.

Recepinanc
источник
0

Класс Emp должен реализовать интерфейс Comaparable, поэтому нам нужно переопределить его метод 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 id
Махадев Мане
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) {
  ...
}
}
pL4Gu33
источник
1
OP спрашивает Comparable, а не Comparator
Абимаран Кугатхасан
Но я думаю, что в этом случае лучшим решением будет компаратор. Вы можете дать ему имя, которое сравнивает компаратор.
pL4Gu33 07
1
Единственная причина иметь компаратор - иметь разные типы сортировки. В противном случае сделать класс сопоставимым - лучшее решение, потому что объект сопоставим и может использоваться напрямую в древовидной карте или любой другой коллекции
Варган
-5

Это легко сделать, реализовав публичный класс, реализующий Comparable. Это позволит вам использовать метод compareTo, который можно использовать с любым другим объектом, с которым вы хотите сравнить.

например, вы можете реализовать это следующим образом:

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

Я думаю, это может решить вашу задачу.

D3X
источник
3
Строка не имеет сравнения
Кеннеди Няга
Вы должны протестировать свой код, прежде чем вставлять его сюда.