Сравним клас

Опитвам се да науча сравнимия клас от известно време, знам правилния синтаксис и как се използва в повечето случаи. Като:

int result = ObjectA.compareTo(ObjectB); 

ще върне стойност 0, ако и двата обекта са еднакви; отрицателна стойност, ако обект A е по-малък от обект B, или положителна стойност, ако A е по-голям от B.

Когато обаче отида да напиша програма, която използва метода compareTo, компилаторът казва, че не може да намери метода compareTo.

въпросът ми е: Трябва ли директно да наследя от класа Comparable, за да използвам метода compareTo? единствената причина, поради която питам, е, че не трябва изрично да наследявате методи като toString или equals... защото всичко наследява от object. Къде попада CompareTo?


person jo pizzamaker    schedule 14.03.2013    source източник
comment
Имайте предвид, че Comparable е интерфейс, а не клас.   -  person pamphlet    schedule 15.03.2013
comment
Сега идва вълна от около 15 отговора, всички казващи едно и също...   -  person Radu Murzea    schedule 15.03.2013


Отговори (5)


Трябва да внедрите интерфейса Comparable:

public class MyClass implements Comparable<MyClass>

и след това декларирайте метода compareTo():

public int compareTo(MyClass myClass){
    //compare and return result
} 
person Jakub Zaverka    schedule 14.03.2013
comment
Е, това има смисъл, ще приема отговора веднага щом ми позволи. - person jo pizzamaker; 15.03.2013

Comparable е интерфейс, а не клас. Така че бихте внедрили интерфейса, а не подклас на класа. Освен това внедряването на интерфейса означава сами да внедрите метода compareTo във вашия клас за изпълнение.

person rgettman    schedule 14.03.2013

  1. Първо, ще работи само в случаи. Не знам дали вашето сравнение сравнява обекти или самите класове поради вашето именуване. Предполагам, че използвате обекти :)
  2. Класът, който искате да сравните с помощта на #compareTo, ТРЯБВА да изпълнява Comparable. Друг начин да постигнете това, без да се налага да прилагате Comparable, е да предоставите вашия метод за сортиране Comparator, очаквайки вашия клас.
person Caesar Ralf    schedule 14.03.2013

Comparable е интерфейс, така че не го "наследявате" (extends), а го прилагате (implements).

Можете да напишете свой собствен compareTo метод във вашия клас, без да указвате Comparable интерфейса, но тогава методите в API няма да знаят дали вашият обект отговаря на договора, който Comparable налага. Така че няма да можете да използвате методи като Arrays.sort() и други подобни, които очакват да работят с обекти, които налагат Comparable.

person SJuan76    schedule 14.03.2013

Ако искате обектите от вашия клас A да се сравняват, вероятно защото искате да сортирате списък от тези обекти, трябва да накарате класа A да реализира Comparable интерфейс.

След като класът A имплементира Comparable, той трябва да имплементира и дефинира поведението на compareTo, което по същество е начина, по който вие искате да бъдат сравнени два обекта от клас A.

Това е този метод, при който можете да решите кои полета от класа A да участват в оценяването на по-малката- или по-голяма стойност на даден обект.

person Community    schedule 14.03.2013