วิธีการใช้งานอินเตอร์เฟซเทียบเคียง 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. ใช้วิธีการที่บอกคุณในแบบที่บอกคุณ
Cairnarvon

3
ฉันได้ดูเอกสาร Java สำหรับมันและแหล่งข้อมูลอื่น ๆ เพื่อพยายามทำความเข้าใจกับมัน แต่ด้วยเหตุผลบางอย่างฉันไม่เข้าใจ ฉันรู้ว่ามันเป็นอะไรที่เรียบง่าย แต่มันก็แค่หนึ่งในนั้น
Softey

ตัวอย่างจำนวนมากยังทำการเปรียบเทียบภายนอกชั้นเรียน แต่ฉันต้องการทำภายใน
Softey

3
ลองพิจารณาเปลี่ยนชื่อตัวแปร "year_discovered" เป็นรูปแบบจาวา "yearDiscovered"
พายุฝนฟ้าคะนอง

ฉันได้เปลี่ยน year_discovered เป็น yearDiscovered นิสัยแย่มากจากการทำหลามสอนตัวเอง ขอบคุณ
Softey

คำตอบ:


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
ใน Androidrequires API 19
Hamzeh Soboh

ทางเลือกคือ: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 ต้องสอดคล้องกับวิธีการเท่ากับเช่นถ้าวัตถุสองชิ้นมีค่าเท่ากันโดยใช้เท่ากับ () ดังนั้น CompareTo () ต้องคืนค่าศูนย์มิฉะนั้นหากวัตถุเหล่านั้นถูกเก็บไว้ใน SortedSet หรือ SortedMap วัตถุเหล่านั้นจะทำงานไม่ถูกต้อง

  2. 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

แต่ฉันคิดว่าในกรณีนี้ตัวเปรียบเทียบเป็นทางออกที่ดีกว่า คุณสามารถตั้งชื่อตามที่ผู้เปรียบเทียบเปรียบเทียบได้
pL4Gu33

1
เหตุผลเดียวที่ต้องมีตัวเปรียบเทียบคือการมีประเภทการเรียงลำดับที่แตกต่างกัน มิฉะนั้นการทำให้คลาสเทียบเคียงกันเป็นทางออกที่ดีกว่าเนื่องจากวัตถุนั้นเทียบเคียงได้และสามารถใช้ในแผนที่ต้นไม้หรือคอลเล็กชันอื่น ๆ ได้โดยตรง
Vargan

-5

สิ่งนี้สามารถทำได้อย่างง่ายดายโดยใช้คลาสสาธารณะที่ใช้เทียบเคียงได้ ซึ่งจะช่วยให้คุณสามารถใช้วิธีการ CompareTo ซึ่งสามารถใช้กับวัตถุอื่น ๆ ที่คุณต้องการเปรียบเทียบได้

ตัวอย่างเช่นคุณสามารถใช้งานได้ด้วยวิธีนี้:

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

ฉันคิดว่านี่อาจช่วยแก้จุดประสงค์ของคุณได้


3
สตริงไม่มีการเปรียบเทียบ
Kennedy Nyaga

คุณควรทดสอบโค้ดของคุณก่อนวางที่นี่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.