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 2014

3
나는 그것에 대한 자바 문서와 그것에 대한 내 머리를 이해하기 위해 다른 소스를 보았지만 어떤 이유로 나는 그것을 이해하지 못한다. 나는 그것이 단순한 것임을 알고 있지만 그것은 그 중 하나 일뿐입니다.
Softey 2014

많은 예제도 클래스 외부에서 비교를 수행하지만 내부에서 수행하고 싶습니다.
Softey

3
또한 변수 이름 "year_discovered"를 Java 규칙 "yearDiscovered"로 변경하는 것을 고려하십시오.
폭풍우

year_discovered를 yearDiscovered로 변경했습니다. 스스로 배운 비단뱀을하는 끔찍한 습관. 감사합니다
Softey 2014

답변:


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주문을 받게됩니다. 난 당신의 아이디어를 얻을 희망 ComparablecompareTo예제로합니다.


2
Android에서requires 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는 equals 메서드와 일치해야합니다. 예를 들어 두 객체가 equals ()를 통해 동일하면 compareTo ()는 0을 반환해야합니다. 그렇지 않으면 해당 객체가 SortedSet 또는 SortedMap에 저장되어 있으면 제대로 작동하지 않습니다.

  2. 이러한 시나리오에서 false를 반환하는 equals ()와 반대로 현재 객체가 null 객체와 비교되면 CompareTo ()는 NullPointerException을 발생시켜야합니다.

더 읽기 : http://javarevisited.blogspot.com/2011/11/how-to-override-compareto-method-in.html#ixzz4B4EMGha3


1

Comparable<Animal>클래스에서 인터페이스를 구현 하고 클래스에서 int compareTo(Animal other)메서드 구현을 제공 합니다. 이 게시물보기



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로이 comaparing하고
Mahadev 갈기

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
Comparator가 아닌 Comparable을 묻는 OP
Abimaran Kugathasan

하지만이 경우 비교기가 더 나은 솔루션이라고 생각합니다. 비교기가 비교하는 이름을 지정할 수 있습니다.
pL4Gu33 2014

1
비교기가 필요한 유일한 이유는 다른 정렬 유형을 갖기 때문입니다. 그렇지 않으면 객체가 비교 가능하고 트리 맵이나 다른 컬렉션에서 직접 사용할 수 있기 때문에 클래스를 비교 가능하게 만드는 것이 더 나은 솔루션입니다
Vargan

-5

이 작업은 Comparable을 구현하는 공용 클래스를 구현하여 쉽게 수행 할 수 있습니다. 이렇게하면 비교하려는 다른 객체와 함께 사용할 수있는 compareTo 메서드를 사용할 수 있습니다.

예를 들어 다음과 같이 구현할 수 있습니다.

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

나는 이것이 당신의 목적을 해결할 것이라고 생각합니다.


3
문자열에 비교가 없습니다
Kennedy Nyaga 2016 년

여기에 붙여 넣기 전에 코드를 테스트해야합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.