Bagaimana cara menerapkan antarmuka yang sebanding dengan Java?

101

Saya tidak yakin bagaimana menerapkan antarmuka yang sebanding ke dalam kelas abstrak saya. Saya memiliki contoh kode berikut yang saya gunakan untuk mencoba dan memahaminya:

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

Saya memiliki kelas uji yang akan membuat objek bertipe Hewan namun saya ingin memiliki antarmuka yang sebanding di dalam kelas ini sehingga tahun penemuan yang lebih tua peringkatnya lebih tinggi daripada yang rendah. Saya tidak tahu bagaimana melakukan hal ini.

Softey
sumber
4
Lihat dokumentasi untuk Comparable. Menerapkan metode yang diperintahkan kepada Anda dengan cara yang diperintahkan.
Cairnarvon
3
Saya telah melihat dokumentasi Java untuk itu dan sumber lain untuk mencoba dan memahaminya tetapi untuk beberapa alasan saya tidak memahaminya. Saya tahu itu sesuatu yang sederhana tetapi itu hanya salah satu dari hal-hal itu.
Softey
Banyak contoh juga melakukan perbandingan di luar kelas tetapi saya ingin melakukannya di dalam.
Softey
3
Pertimbangkan juga untuk mengubah nama variabel "year_discovered" menjadi konvensi java "yearDiscovered".
badai
Saya telah mengubah year_discovered menjadi yearDiscovered. Kebiasaan buruk dari melakukan otodidak python. Terima kasih
Softey

Jawaban:

156

Anda hanya perlu mendefinisikan itu Animal implements Comparable<Animal>yaitu public class Animal implements Comparable<Animal>. Dan kemudian Anda harus menerapkan compareTo(Animal other)metode yang Anda suka.

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

Dengan penerapan ini compareTo, hewan dengan tingkat yang lebih tinggi year_discoveredakan mendapatkan urutan yang lebih tinggi. Saya harap Anda memahami Comparabledan compareTodengan contoh ini.

pengguna1983983
sumber
2
Di Android iturequires API 19
Hamzeh Soboh
Alternatifnya adalah:return ((Integer)this.level).compareTo(other.level);
Hamzeh Soboh
36

Kamu butuh:

  • Tambahkan implements Comparable<Animal>ke deklarasi kelas; dan
  • Menerapkan int compareTo( Animal a )metode untuk melakukan perbandingan.

Seperti ini:

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

Saat Anda berada di dalamnya, saya sarankan untuk mengingat beberapa fakta kunci tentang metode bandingkanTo ()

  1. BandingkanTo harus konsisten dengan metode sama dengan misalnya jika dua objek sama melalui sama dengan (), maka bandingkanTo () harus mengembalikan nol jika tidak, jika objek tersebut disimpan dalam SortedSet atau SortedMap, mereka tidak akan berperilaku dengan benar.

  2. CompareTo () harus menampilkan NullPointerException jika objek saat ini dibandingkan dengan objek null sebagai lawan dari equals () yang menampilkan false pada skenario tersebut.

Baca lebih lanjut: http://javarevisited.blogspot.com/2011/11/how-to-override-compareto-method-in.html#ixzz4B4EMGha3

tamu
sumber
1

Implementasikan Comparable<Animal>antarmuka di kelas Anda dan berikan implementasi int compareTo(Animal other)metode di kelas Anda. Lihat Posting Ini

Sanjeev
sumber
0

Alternatif yang mungkin dari kode sumber Integer.comparemetode yang membutuhkan API Version 19adalah:

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

Alternatif ini tidak mengharuskan Anda untuk menggunakan API version 19.

recepinanc
sumber
0

Kelas emp perlu mengimplementasikan antarmuka Comaparable sehingga kita perlu mengganti metode compateTo-nya.

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 Mane
sumber
Saya membandingkan ini dengan emp id
Mahadev Mane
0

Berikut kode untuk mengimplementasikan antarmuka yang sebanding dengan 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);
    }
}
Siwa
sumber
-1

Gunakan Pembanding ...

    public class AnimalAgeComparator implements Comparator<Animal> {

@Override
public int compare(Animal a1, Animal a2) {
  ...
}
}
pL4Gu33
sumber
1
OP meminta Sebanding, bukan Pembanding
Abimaran Kugathasan
Tetapi saya pikir dalam hal ini komparator adalah solusi yang lebih baik. Anda dapat memberi nama apa yang dibandingkan oleh pembanding.
pL4Gu33
1
Satu-satunya alasan untuk memiliki pembanding adalah memiliki jenis pengurutan yang berbeda. Jika tidak, membuat kelas yang sebanding adalah solusi yang lebih baik karena objeknya sebanding, dan dapat digunakan di peta hierarki atau koleksi lainnya secara langsung
Vargan
-5

Hal ini dapat dengan mudah dilakukan dengan mengimplementasikan kelas publik yang mengimplementasikan Comparable. Ini akan memungkinkan Anda untuk menggunakan metode bandingkanTo yang dapat digunakan dengan objek lain yang ingin Anda bandingkan.

misalnya Anda dapat menerapkannya dengan cara ini:

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

Saya pikir ini mungkin menyelesaikan tujuan Anda.

D3X
sumber
3
String tidak memiliki perbandingan
Kennedy Nyaga
Anda harus menguji kode Anda sebelum menempelkannya di sini.