2014-02-07 18 views
76

Ich bin nicht sicher, wie eine vergleichbare Schnittstelle in meine abstrakte Klasse zu implementieren. Ich habe den folgenden Beispiel-Code, den ich versuchen bin mit und meinen Kopf herum:Wie implementiert man die Java-vergleichbare Schnittstelle?

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 eine Testklasse, das jedoch Objekte vom Typ Tiere schaffen will ich eine vergleichbare Schnittstelle innerhalb dieser Klasse haben will so dass ältere Entdeckungsjahre höher als niedrig sind. Ich habe keine Ahnung, wie ich das machen soll.

+4

Blick in die Dokumentation für 'Comparable'. Implementieren Sie die Methode, zu der Sie es sagen, so, wie es Ihnen sagt. – Cairnarvon

+2

Ich habe mir die Java-Dokumentation dafür und andere Quellen angeschaut, um zu versuchen, mich damit zu beschäftigen, aber aus irgendeinem Grund verstehe ich es nicht. Ich weiß, es ist etwas Einfaches, aber es ist nur eines dieser Dinge. – Softey

+0

Viele Beispiele tun auch den Vergleich außerhalb der Klasse, aber ich möchte es innen tun. – Softey

Antwort

119

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

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

Mit dieser Implementierung von compareTo, Tiere mit einem höheren year_discovered höher bekommen bestellt. Ich hoffe, Sie bekommen die Idee von Comparable und compareTo mit diesem Beispiel.

+2

In Android es 'erfordert API 19' –

+0

Alternative ist:' return ((Integer) this.level) .compareTo (andere.level); ' –

1

Implementieren Sie Comparable<Animal> Schnittstelle in Ihrer Klasse und bieten Implementierung int compareTo(Animal other) Methode in Ihrer Klasse. See This Post

-1

einen Komparator verwenden ...

public class AnimalAgeComparator implements Comparator<Animal> { 

@Override 
public int compare(Animal a1, Animal a2) { 
    ... 
} 
} 
+0

OP fragt Vergleichbar, nicht Comparator –

+0

Aber ich denke in diesem Fall ein Komparator ist die bessere Lösung. Sie können ihm einen Namen geben, was der Komparator vergleicht. – pL4Gu33

+0

Der einzige Grund, Komparator zu haben, ist, unterschiedliche Sortierarten zu haben. Andernfalls ist die Vergleichbarkeit der Klasse eine bessere Lösung, da das Objekt vergleichbar ist und direkt in einer Treemap oder einer anderen Sammlung verwendet werden kann. – Vargan

28

Sie müssen:

  • implements Comparable<Animal> zu der Klassendeklaration hinzufügen; und
  • Implementieren Sie eine int compareTo(Animal a) Methode, um die Vergleiche durchzuführen.

So:

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

Diese Sache leicht durch die Implementierung einer öffentlichen Klasse durchgeführt werden kann, die vergleichbare implementiert. Dadurch können Sie die compareTo-Methode verwenden, die mit jedem anderen Objekt verwendet werden kann, mit dem Sie vergleichen möchten.

zum Beispiel können Sie es auf diese Weise implementieren:

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

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

+1

String hat keinen Vergleich –

3

Während Sie in ihm sind, schlage ich vor, einige wichtige Fakten über compareTo() -Methoden

  1. CompareTo müssen in Einklang erinnern mit Methode entspricht z.B. Wenn zwei Objekte über equals() gleich sind, muss compareTo() Null zurückgeben. Wenn diese Objekte in SortedSet oder SortedMap gespeichert werden, verhalten sie sich andernfalls nicht ordnungsgemäß.

  2. CompareTo() muss NullPointerException auslösen, wenn das aktuelle Objekt mit null verglichen mit dem Objekt equals() verglichen wird, das bei einem solchen Szenario false zurückgibt.

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

0

Mögliche Alternative aus dem Quellcode von Integer.compare Methode, die API Version 19 erfordert wird:

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

Diese Alternative nicht benötigen Sie API version 19 zu verwenden.

0

Die Emp-Klasse muss die ComaParable-Schnittstelle implementieren, daher müssen wir die compateTo-Methode überschreiben.

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

} 
+0

Bitte erläutern Sie Ihren Code –

+0

Ich vergleiche dies mit emp id –

Verwandte Themen