如何实现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 2014年

3
我看过有关它的Java文档和其他资料,以期设法弄清楚它,但是由于某种原因,我不理解它。我知道这很简单,但这只是其中之一。
Softey 2014年

许多示例还在类外进行比较,但我想在类内进行比较。
Softey 2014年

3
还可以考虑将变量名“ year_discovered”更改为java约定“ yearDiscovered”。
2014年

我已将year_discovered更改为yearDiscovered。通过自学Python的可怕习惯。谢谢
Softey 2014年

Answers:


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将获得更高的顺序。我希望你的想法ComparablecompareTo这个例子。


2
在Android中它requires API 19
Hamzeh Soboh

替代方法是:return ((Integer)this.level).compareTo(other.level);
Hamzeh Soboh,2017年

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

当您在其中时,我建议您记住有关compareTo()方法的一些关键事实

  1. CompareTo必须与equals方法一致,例如,如果两个对象通过equals()相等,则compareTo()必须返回零,否则,如果这些对象存储在SortedSet或SortedMap中,它们将无法正常工作。

  2. 如果将当前对象与空对象进行比较,而equals()在这种情况下返回false,则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类需要实现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进行补偿
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
OP询问可比而不是比较者
Abimaran Kugathasan 2014年

但我认为在这种情况下,比较器是更好的解决方案。您可以给它起一个比较器进行比较的名称。
pL4Gu33 2014年

1
使用比较器的唯一原因是具有不同的排序类型。否则,使类具有可比性是更好的解决方案,因为对象具有可比性,并且可以直接在树形图或任何其他集合中使用
Vargan

-5

通过实现实现Comparable的公共类,可以轻松地完成此操作。这将允许您使用compareTo方法,该方法可以与您要比较的任何其他对象一起使用。

例如,您可以通过以下方式实现它:

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

我认为这可以解决您的目的。


3
字符串没有比较
肯尼迪尼亚加

在将代码粘贴到此处之前,应先对其进行测试。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.