Wie implementiere ich die Java vergleichbare Schnittstelle?

101

Ich bin nicht sicher, wie ich eine vergleichbare Schnittstelle in meine abstrakte Klasse implementieren soll. Ich habe den folgenden Beispielcode, mit dem ich versuche, mich darum zu kümmern:

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

Ich habe eine Testklasse, die Objekte vom Typ Animal erstellt. Ich möchte jedoch eine vergleichbare Schnittstelle innerhalb dieser Klasse haben, damit ältere Jahre der Entdeckung einen höheren Rang als niedrig haben. Ich habe jedoch keine Ahnung, wie ich das anstellen soll.

Softey
quelle
4
Schauen Sie sich die Dokumentation für an Comparable. Implementieren Sie die Methode, die Sie dazu auffordern, so, wie es Ihnen sagt.
Cairnarvon
3
Ich habe mir die Java-Dokumentation und andere Quellen angesehen, um mich darum zu kümmern, aber aus irgendeinem Grund verstehe ich es nicht. Ich weiß, dass es etwas Einfaches ist, aber es ist nur eines dieser Dinge.
Softey
Viele Beispiele führen den Vergleich auch außerhalb der Klasse durch, aber ich möchte ihn innerhalb der Klasse durchführen.
Softey
3
Erwägen Sie auch, den Variablennamen "year_discovered" in die Java-Konvention "yearDiscovered" zu ändern.
Stürme
Ich habe year_discovered in yearDiscovered geändert. Schreckliche Gewohnheiten, Autodidakt Python zu machen. Vielen Dank
Softey

Antworten:

156

Sie müssen nur das definieren, Animal implements Comparable<Animal>dh public class Animal implements Comparable<Animal>. Und dann müssen Sie die compareTo(Animal other)Methode so implementieren , wie Sie es möchten.

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

Mit dieser Implementierung von compareTowerden Tiere mit einem höheren year_discoveredWert höher geordnet. Ich hoffe, Sie bekommen die Idee von Comparableund compareTomit diesem Beispiel.

user1983983
quelle
2
In Android esrequires API 19
Hamzeh Soboh
Alternative ist:return ((Integer)this.level).compareTo(other.level);
Hamzeh Soboh
36

Du brauchst:

  • In implements Comparable<Animal>der Klasse Erklärung; und
  • Implementieren Sie eine int compareTo( Animal a )Methode, um die Vergleiche durchzuführen.

So was:

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
quelle
6

Während Sie dabei sind, empfehle ich Ihnen, sich einige wichtige Fakten zu compareTo () -Methoden zu merken

  1. CompareTo muss mit der Methode equals übereinstimmen, z. B. wenn zwei Objekte über equals () gleich sind, muss compareTo () Null zurückgeben. Andernfalls verhalten sich diese Objekte nicht richtig, wenn sie in SortedSet oder SortedMap gespeichert sind.

  2. CompareTo () muss eine NullPointerException auslösen, wenn das aktuelle Objekt mit dem Nullobjekt verglichen wird, im Gegensatz zu equals (), die in einem solchen Szenario false zurückgeben.

Lesen Sie mehr: http://javarevisited.blogspot.com/2011/11/how-to-override-compareto-method-in.html#ixzz4B4EMGha3

Gast
quelle
1

Implementieren Sie die Comparable<Animal>Schnittstelle in Ihrer Klasse und stellen Sie die Implementierung der int compareTo(Animal other)Methode in Ihrer Klasse bereit . Siehe diesen Beitrag

Sanjeev
quelle
0

Mögliche Alternative zum Quellcode der Integer.compareMethode, die erfordert, API Version 19ist:

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

Diese Alternative erfordert keine Verwendung API version 19.

Recepinanc
quelle
0

Die Emp-Klasse muss die Comaparable-Schnittstelle implementieren, damit die compateTo-Methode überschrieben werden kann.

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

}
Mahadev Mähne
quelle
Ich vergleiche dies mit emp id
Mahadev Mane
0

Hier ist der Code zum Implementieren einer Java-vergleichbaren Schnittstelle:

// 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);
    }
}
Shiva
quelle
-1

Verwenden Sie einen Komparator ...

    public class AnimalAgeComparator implements Comparator<Animal> {

@Override
public int compare(Animal a1, Animal a2) {
  ...
}
}
pL4Gu33
quelle
1
OP fragen Vergleichbar, nicht Vergleicher
Abimaran Kugathasan
Aber ich denke in diesem Fall ist ein Komparator die bessere Lösung. Sie können ihm einen Namen geben, was der Komparator vergleicht.
pL4Gu33
1
Der einzige Grund für einen Komparator sind unterschiedliche Sortiertypen. Andernfalls ist es besser, die Klasse vergleichbar zu machen, da das Objekt vergleichbar ist und direkt in einer Baumkarte oder einer anderen Sammlung verwendet werden kann
Vargan,
-5

Dies kann leicht durch Implementieren einer öffentlichen Klasse erreicht werden, die Comparable implementiert. Auf diese Weise können Sie die compareTo-Methode verwenden, die mit jedem anderen Objekt verwendet werden kann, mit dem Sie vergleichen möchten.

Sie können es beispielsweise folgendermaßen implementieren:

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

Ich denke, das könnte Ihren Zweck lösen.

D3X
quelle
3
String hat keinen Vergleich
Kennedy Nyaga
Sie sollten Ihren Code testen, bevor Sie ihn hier einfügen.