【问题标题】:How to implement the Java comparable interface?如何实现Java可比接口?
【发布时间】:2014-03-04 18:54:07
【问题描述】:

我不确定如何在我的抽象类中实现类似的接口。我有以下示例代码,我正在使用它来尝试理解它:

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

我有一个测试类,它将创建动物类型的对象,但是我希望在这个类中有一个可比较的接口,以便较早的发现排名高于低。不过我不知道该怎么做。

【问题讨论】:

  • 查看Comparable 的文档。以它告诉你的方式实现它告诉你的方法。
  • 我已经查看了它的 Java 文档和其他资源以尝试理解它,但由于某种原因我不理解它。我知道这很简单,但这只是其中之一。
  • 很多例子也在课外做比较,但我想在里面做。
  • 还可以考虑将变量名“year_discovered”更改为 java 约定“yearDiscovered”。
  • 我已将 year_discovered 更改为 yearDiscovered。做自学python的可怕习惯。谢谢

标签: java comparable


【解决方案1】:

您只需定义 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

【讨论】:

  • 在 Android 中是 requires API 19
  • 替代方案是:return ((Integer)this.level).compareTo(other.level);
【解决方案2】:

你需要:

  • 在类声明中添加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);
    }
}

【讨论】:

    【解决方案3】:

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

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

    2. 如果当前对象与 null 对象进行比较,CompareTo() 必须抛出 NullPointerException,而不是在这种情况下返回 false 的 equals()。

    阅读更多:http://javarevisited.blogspot.com/2011/11/how-to-override-compareto-method-in.html#ixzz4B4EMGha3

    【讨论】:

      【解决方案4】:

      在您的类中实现Comparable&lt;Animal&gt; 接口并在您的类中提供int compareTo(Animal other) 方法的实现。See This Post

      【讨论】:

        【解决方案5】:

        您需要实现接口并定义 compareTo() 方法。 对于一个好的教程去 - Tutorials point link 要么 MyKongLink

        【讨论】:

          【解决方案6】:

          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 进行比较
          【解决方案7】:

          需要API Version 19Integer.compare 方法的源代码的可能替代方案是:

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

          此替代方法要求您使用API version 19

          【讨论】:

            【解决方案8】:

            这是实现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);
                }
            }
            

            【讨论】:

              【解决方案9】:

              使用比较器...

                  public class AnimalAgeComparator implements Comparator<Animal> {
              
              @Override
              public int compare(Animal a1, Animal a2) {
                ...
              }
              }
              

              【讨论】:

              • OP 询问 Comparable,而不是 Comparator
              • 但我认为在这种情况下比较器是更好的解决方案。你可以给它一个比较器比较的名字。
              • 拥有比较器的唯一原因是有不同的排序类型。否则,使类具有可比性是更好的解决方案,因为对象是可比较的,并且可以直接在树形图或任何其他集合中使用
              【解决方案10】:

              这件事可以通过实现一个实现 Comparable 的公共类来轻松完成。这将允许您使用 compareTo 方法,该方法可与您希望比较的任何其他对象一起使用。

              例如你可以这样实现它:

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

              我认为这可能会解决您的目的。

              【讨论】:

              • 字符串没有比较
              • 您应该在将代码粘贴到此处之前对其进行测试。
              猜你喜欢
              • 2012-11-01
              • 1970-01-01
              • 2016-05-08
              • 1970-01-01
              • 2016-06-27
              • 2015-03-30
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多