Java ile karşılaştırılabilir arayüz nasıl uygulanır?


101

Soyut sınıfıma benzer bir arabirimi nasıl uygulayacağımdan emin değilim. Denemek ve etrafından dolaşmak için kullandığım aşağıdaki örnek koda sahibim:

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 türünde nesneler yaratacak bir test sınıfım var ancak bu sınıf içinde karşılaştırılabilir bir arayüze sahip olmak istiyorum, böylece eski keşif yıllarının düşükten daha yüksek sıralanması için. Bunu nasıl yapacağım konusunda hiçbir fikrim yok.


4
İçin belgelere bakın Comparable. Size söylediği yöntemi söylediği şekilde uygulayın.
Cairnarvon

3
Bunun için Java belgelerine ve diğer kaynaklara baktım ve kafamı karıştırdım, ancak nedense anlamıyorum. Bunun basit bir şey olduğunu biliyorum ama bu sadece onlardan biri.
Softey

Birçok örnek sınıf dışında da karşılaştırma yapıyor ama ben içeride yapmak istiyorum.
Softey

3
Ayrıca "year_discovered" değişken adını java kuralı "yearDiscovered" olarak değiştirmeyi düşünün.
tstorms

Year_discovered değerini yearDiscovered olarak değiştirdim. Kendi kendine öğretilen python yapmaktan korkunç alışkanlıklar. Teşekkürler
Softey

Yanıtlar:


156

Bunu sadece tanımlamak zorunda Animal implements Comparable<Animal>yani public class Animal implements Comparable<Animal>. Ve sonra compareTo(Animal other)yöntemi beğendiğiniz şekilde uygulamalısınız .

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

Bu uygulamayı kullanarak compareTo, daha yüksek olan hayvanlar daha yüksek year_discoveredsıralanır. Sana fikrini almak umut Comparableve compareTobu örnek ile.


2
Android'derequires API 19
Hamzeh Soboh

Alternatif:return ((Integer)this.level).compareTo(other.level);
Hamzeh Soboh

36

Gerek:

  • implements Comparable<Animal>Sınıf bildirimine ekleyin ; ve
  • int compareTo( Animal a )Karşılaştırmaları gerçekleştirmek için bir yöntem uygulayın.

Bunun gibi:

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

Siz oradayken, CompareTo () yöntemleri hakkında bazı önemli gerçekleri hatırlamanızı öneririm.

  1. CompareTo, eşittir yöntemiyle tutarlı olmalıdır, örneğin, iki nesne eşittir () yoluyla eşitse, orada CompareTo () sıfır döndürmelidir, aksi takdirde bu nesneler SortedSet veya SortedMap içinde saklanırsa, düzgün davranmazlar.

  2. CompareTo (), böyle bir senaryoda false döndüren equals () yerine mevcut nesne null nesneyle karşılaştırılırsa NullPointerException oluşturmalıdır.

Daha fazlasını okuyun: http://javarevisited.blogspot.com/2011/11/how-to-override-compareto-method-in.html#ixzz4B4EMGha3


1

Uygulamak Comparable<Animal>Sınıfınızdaki arayüz ve uygulanmasını sağlamak int compareTo(Animal other)sınıfınızda yöntemle. Bu Gönderiyi Gör



0

Integer.compareYöntem kaynak kodundan olası alternatif API Version 19şudur:

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

Bu alternatif , kullanmanızı gerektirmez API version 19.


0

Emp sınıfının Comaparable arabirimini uygulaması gerekir, bu nedenle compateTo yöntemini geçersiz kılmamız gerekir.

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

}

Bunu emp id ile karşılaştırıyorum
Mahadev Mane

0

Java ile karşılaştırılabilir arayüzü uygulamak için gereken kod şu şekildedir:

// 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

Bir Karşılaştırıcı Kullanın ...

    public class AnimalAgeComparator implements Comparator<Animal> {

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

1
OP Karşılaştırılabilir soruyor, Karşılaştırıcı değil
Abimaran Kugathasan

Ama bence bu durumda bir karşılaştırıcı daha iyi bir çözümdür. Karşılaştırıcının karşılaştırdığı bir ad verebilirsiniz.
pL4Gu33

1
Karşılaştırıcıya sahip olmanın tek nedeni, farklı sıralama türlerine sahip olmaktır. Aksi takdirde, sınıfı karşılaştırılabilir yapmak daha iyi bir çözümdür çünkü nesne karşılaştırılabilirdir ve bir ağaç haritasında veya başka bir koleksiyonda doğrudan kullanılabilir
Vargan

-5

Bu şey, Comparable'ı uygulayan bir genel sınıf uygulayarak kolayca yapılabilir. Bu, karşılaştırmak istediğiniz diğer herhangi bir nesne ile kullanılabilen CompareTo yöntemini kullanmanıza izin verecektir.

örneğin bunu şu şekilde uygulayabilirsiniz:

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

Bunun amacını çözebileceğini düşünüyorum.


3
Dizge karşılaştırılmamış
Kennedy Nyaga

Kodunuzu buraya yapıştırmadan önce test etmelisiniz.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.