2014-02-07 2 views
76

Я не уверен, как реализовать сопоставимый интерфейс в моем абстрактном классе. У меня есть следующий пример кода, который я использую, чтобы попытаться получить мою голову вокруг него:Как реализовать сопоставимый интерфейс Java?

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

У меня есть тестовый класс, который будет создавать объекты типа животных, однако я хочу, чтобы иметь сопоставимую интерфейс внутри этого класса так что более старые годы открытия выше, чем низкие. Я понятия не имею, как это сделать.

+4

Посмотрите на документацию для 'Comparable'. Реализуйте метод, который он вам скажет так, как он вам говорит. – Cairnarvon

+2

Я посмотрел документацию на Java для него и других источников, чтобы попытаться обойти его, но по какой-то причине я этого не понимаю. Я знаю, что это просто, но это всего лишь одна из тех вещей. – Softey

+0

Многие примеры также делают сравнение вне класса, но я хочу сделать это внутри. – Softey

ответ

119

Вам нужно только определить, что Animal implements Comparable<Animal> i.e. 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

В Android требуется '' API 19' –

+0

Альтернатива: 'return ((Integer) this.level) .compareTo (other.level);' –

1

Внесите Comparable<Animal> интерфейс в свой класс и обеспечите реализацию метода int compareTo(Animal other) в вашем классе. See This Post

1

Вам понадобится реализовать интерфейс и определить метод compareTo(). Для хорошего учебника пойти - Tutorials point link или MyKongLink

-1

Используйте компаратор ...

public class AnimalAgeComparator implements Comparator<Animal> { 

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

OP запросить сопоставимый, а не компаратор –

+0

Но я думаю, что в этом случае компаратор является лучшим решением. Вы можете дать ему имя, которое сравнивает компаратор. – pL4Gu33

+0

Единственная причина, по которой компаратор должен иметь разные типы сортировки. В противном случае сопоставление класса является лучшим решением, потому что объект сопоставим и может быть использован в treemap или любой другой коллекции напрямую. – Vargan

28

Вам нужно:

  • Добавить 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); 
    } 
} 
-4

Эта вещь может быть легко сделано путем реализации общественного класса, который реализует Сопоставимые. Это позволит вам использовать метод compareTo, который можно использовать с любым другим объектом, к которому вы хотите сравнить.

, например, вы можете реализовать это следующим образом:

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

Я думаю, что это может решить вашу цель.

+1

String не имеет сравнения. –

3

В то время как вы в нем, я предлагаю вспомнить некоторые ключевые факты о CompareTo() методы

  1. CompareTo должны быть в соответствии с методом, например, равен если два объекта равны через equals(), compareTo() должен возвращать ноль, если эти объекты хранятся в SortedSet или SortedMap, они не будут корректно вести себя.

  2. CompareTo() должен выдавать исключение NullPointerException, если текущий объект сравнивается с нулевым объектом, а не equals(), который возвращает false в таком сценарии.

Подробнее: 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); 
     } 
    } 

} 
+0

, пожалуйста, объясните свой код. –

+0

. Я комментирую это с помощью emp id –

Смежные вопросы