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。指示された方法で、指示された方法を実装します。
ケアナーボン2014

3
Javaのドキュメントと他のソースを調べて頭を悩ませましたが、何らかの理由で理解できません。シンプルなことは知っていますが、それはその1つにすぎません。
Softey、2014

多くの例でもクラスの外で比較を行っていますが、内部で行いたいと思います。
Softey、2014

3
また、変数名「year_discovered」をJava規則「yearDiscovered」に変更することも検討してください。
14

year_discoveredをyearDiscoveredに変更しました。独学のpythonを行うことによる恐ろしい習慣。ありがとう
Softey、2014

回答:


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ではrequires API 19
Hamzeh Soboh 2017年

代替です: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

その間、compareTo()メソッドに関するいくつかの重要な事実を覚えておくことをお勧めします

  1. CompareToは、equalsメソッドと一致している必要があります。たとえば、2つのオブジェクトがequals()で等しい場合、compareTo()はゼロを返す必要があります。そうでない場合、それらのオブジェクトがSortedSetまたはSortedMapに格納されていると、正しく動作しません。

  2. このようなシナリオでfalseを返すequals()とは対照的に、現在のオブジェクトがnullオブジェクトと比較される場合、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
ストリングに比較はありません
ケネディニアガ2016年

ここに貼り付ける前に、コードをテストする必要があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.