Làm thế nào để triển khai giao diện so sánh Java?


101

Tôi không chắc chắn về cách triển khai giao diện có thể so sánh vào lớp trừu tượng của mình. Tôi có mã ví dụ sau mà tôi đang sử dụng để thử và tìm hiểu kỹ về nó:

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

Tôi có một lớp thử nghiệm sẽ tạo các đối tượng kiểu Động vật, tuy nhiên tôi muốn có một giao diện có thể so sánh được bên trong lớp này để xếp hạng khám phá cũ hơn là thấp hơn. Tôi không biết làm thế nào để tiếp tục việc này.


4
Nhìn vào tài liệu cho Comparable. Thực hiện phương pháp nó yêu cầu bạn theo cách nó yêu cầu.
Cairnarvon

3
Tôi đã xem tài liệu Java về nó và các nguồn khác để thử và tìm hiểu kỹ về nó nhưng vì một số lý do tôi không hiểu nó. Tôi biết nó là một cái gì đó đơn giản nhưng nó chỉ là một trong những điều đó.
Softey

Rất nhiều ví dụ cũng thực hiện so sánh bên ngoài lớp nhưng tôi muốn làm điều đó bên trong.
Softey

3
Cũng nên xem xét việc thay đổi tên biến "year_discovered" thành quy ước java "yearDiscovered".
bão táp vào

Tôi đã thay đổi year_discovered thành yearDiscovered. Những thói quen kinh khủng từ việc tự dạy con trăn. Cảm ơn bạn
Softey

Câu trả lời:


156

Bạn chỉ cần xác định nghĩa Animal implements Comparable<Animal>public class Animal implements Comparable<Animal>. Và sau đó bạn phải thực hiện compareTo(Animal other)phương pháp theo cách bạn thích.

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

Sử dụng cách triển khai này compareTo, những con vật có giá trị cao hơn year_discoveredsẽ được đặt hàng cao hơn. Tôi hy vọng bạn có được ý tưởng ComparablecompareTovới ví dụ này.


2
Trong Android nórequires API 19
Hamzeh Soboh

Thay thế là:return ((Integer)this.level).compareTo(other.level);
Hamzeh Soboh,

36

Bạn cần phải:

  • Thêm vào implements Comparable<Animal>khai báo lớp; và
  • Thực hiện một int compareTo( Animal a )phương pháp để thực hiện các phép so sánh.

Như thế này:

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

Trong khi bạn đang ở trong đó, tôi khuyên bạn nên nhớ một số thông tin quan trọng về các phương thức CompareTo ()

  1. CompareTo phải phù hợp với phương thức equals, ví dụ nếu hai đối tượng bằng nhau thông qua equals (), thì CompareTo () phải trả về 0, ngược lại nếu các đối tượng đó được lưu trữ trong SortedSet hoặc SortedMap thì chúng sẽ không hoạt động đúng.

  2. CompareTo () phải ném NullPointerException nếu đối tượng hiện tại được so sánh với đối tượng null trái ngược với equals () trả về false trong trường hợp như vậy.

Đọc thêm: http://javarevisited.blogspot.com/2011/11/how-to-override-compareto-method-in.html#ixzz4B4EMGha3


1

Triển khai Comparable<Animal>giao diện trong lớp của bạn và cung cấp triển khai int compareTo(Animal other)phương thức trong lớp của bạn. Xem bài đăng này



0

Có thể thay thế từ mã nguồn của Integer.comparephương thức yêu cầu API Version 19là:

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

Thay thế này không yêu cầu bạn sử dụng API version 19.


0

Lớp Emp cần triển khai giao diện có thể so sánh được, vì vậy chúng ta cần Ghi đè phương thức compateTo của nó.

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

}

Tôi comaparing này với emp id
Mahadev Mane

0

Đây là mã để triển khai giao diện tương đương 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

Sử dụng Bộ so sánh ...

    public class AnimalAgeComparator implements Comparator<Animal> {

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

1
OP hỏi tương đương, không sánh
Abimaran Kugathasan

Nhưng tôi nghĩ trong trường hợp này một bộ so sánh là giải pháp tốt hơn. Bạn có thể đặt tên cho nó mà bộ so sánh so sánh.
pL4Gu33

1
Lý do duy nhất để có bộ so sánh là có nhiều kiểu sắp xếp khác nhau. Nếu không, làm cho lớp tương đương là một giải pháp tốt hơn vì đối tượng có thể so sánh, và có thể được sử dụng trong một biểu đồ dạng cây hoặc bất kỳ bộ sưu tập khác trực tiếp
Vargan

-5

Điều này có thể dễ dàng được thực hiện bằng cách triển khai một lớp công khai thực hiện có thể so sánh. Điều này sẽ cho phép bạn sử dụng phương thức CompareTo có thể được sử dụng với bất kỳ đối tượng nào khác mà bạn muốn so sánh.

ví dụ, bạn có thể triển khai nó theo cách này:

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

Tôi nghĩ rằng điều này có thể giải quyết mục đích của bạn.


3
Chuỗi không có so sánh
Kennedy Nyaga

Bạn nên kiểm tra mã của mình trước khi dán vào đây.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.