Często chcemy porównać ze sobą dwa obiekty jakiejś klasy. Oczywiście możemy porównać odpowiednie pola klasy i zwrócić wynik, ale.... rozwiązanie idealne polega na zaimplementowaniu w naszej klasie interfejsu
Comparable<T>. Dzięki implementacji interfejsu, obiekty powstałe na bazie naszej klasy będą mogły być porównywane ze sobą. Taki sposób porównywania (mówiąc inaczej uporządkowania obiektów) jest wykorzystywany przez Javę np. w kolekcjach. Standardowe klasy np. klasa
String również implementują ten interfejs. Dzięki temu porównując dwa łańcuchy tekstowe wiemy który jest "mniejszy", a który "większy" (w tym przypadku wykorzystywane jest uporządkowanie alfabetyczne). Wróćmy do interfejsu
Comparable<T>, ma on tylko jedną metodę:
1.
public
int
compareTo(T obiekt);
Metoda
compareTo() może zwracać wartość ujemną, dodatnią albo zero odpowiednio dla obiektów mniejszych, większych lub równych obiektowi przekazanemu jako parametr jej wywołania. Wykorzystajmy interfejs
Comparable<T> w przykładowej klasie Student. Nasza klasa będzie posiadać trzy pola: imię, nazwisko oraz numer albumu. Chcemy aby obiekty tworzone na jej podstawie można było porównywać ze sobą według nazwiska. Zastosowanie typów generycznych w interfejsie umożliwia nam swobodniejszy dostęp do obiektów, nie musimy wykonywać rzutowania (więcej o typach generycznych -
Typy generyczne).
01.
02.
03.
04.
05.
06.
07.
08.
09.
class
Student
implements
Comparable<Student> {
10.
11.
private
String imie;
12.
private
String nazwisko;
13.
private
int
nrAlbumu;
14.
15.
16.
public
Student(String imie, String nazwisko,
int
nrAlbumu) {
17.
this
.imie = imie;
18.
this
.nazwisko = nazwisko;
19.
this
.nrAlbumu = nrAlbumu;
20.
}
21.
22.
23.
public
int
compareTo(Student obiekt) {
24.
25.
26.
return
nazwisko.compareTo(obiekt.nazwisko);
27.
}
28.
29.
30.
public
String toString() {
31.
return
(nazwisko +
" "
+ imie +
" "
+ nrAlbumu);
32.
}
33.
}
Poniżej przykład wykorzystania klasy
Student. Tworzymy tablicę obiektów, sortujemy ją i wyświetlamy na ekranie.
01.
02.
03.
04.
05.
06.
07.
08.
import
java.util.Arrays;
09.
10.
public
class
TestPorownania {
11.
public
static
void
main(String[] args) {
12.
13.
Student[] studenci =
new
Student[
6
];
14.
15.
16.
studenci[
0
] =
new
Student(
"Marek"
,
"Zielony"
,
4325
);
17.
studenci[
1
] =
new
Student(
"Jacek"
,
"Mruczek"
,
7453
);
18.
studenci[
2
] =
new
Student(
"Iwona"
,
"Lonkis"
,
2644
);
19.
studenci[
3
] =
new
Student(
"Marta"
,
"Annas"
,
1632
);
20.
studenci[
4
] =
new
Student(
"Adam"
,
"Mruczek"
,
3856
);
21.
studenci[
5
] =
new
Student(
"Marek"
,
"Zielony"
,
4287
);
22.
23.
24.
25.
Arrays.sort(studenci);
26.
27.
28.
for
(Student st: studenci){
29.
System.out.println(st);
30.
}
31.
}
32.
}
Uruchomiona aplikacja:
Annas Marta 1632
Lonkis Iwona 2644
Mruczek Jacek 7453
Mruczek Adam 3856
Zielony Marek 4325
Zielony Marek 4287
Możemy poszerzyć zakres porównania dla studentów o takich samych nazwiskach. W ich przypadku będziemy porównywać również imiona, a gdy one również będą takie same numery albumu. Poprawiona metoda
compareTo() przedstawia się następująco:
01.
public
int
compareTo(Student obiekt) {
02.
03.
if
(nazwisko.compareTo(obiekt.nazwisko) ==
0
)
04.
05.
if
(imie.compareTo(obiekt.imie) ==
0
)
06.
07.
return
nrAlbumu - obiekt.nrAlbumu;
08.
else
09.
10.
return
imie.compareTo(obiekt.imie);
11.
else
12.
13.
return
nazwisko.compareTo(obiekt.nazwisko);
14.
}
Wynik działania ze zmienioną metodą
compareTo():
Annas Marta 1632
Lonkis Iwona 2644
Mruczek Adam 3856
Mruczek Jacek 7453
Zielony Marek 4287
Zielony Marek 4325
Posty o podobnej tematyce
7 Komentarzy - Porównujemy obiekty - interfejs Comparable<T>
Bardzo Ciekawy artykuł na temat
Interfejs, można się ciekawych rzeczy dowiedzieć ;D
Dzięki za wrzutkę
Skoro nazwisko ma zasięg private to dlaczego możemy odwołaś się do niego w metodzie compareTo poprzez obiekt.nazwisko?
Bo private odnosi się do klas, a nie do obiektów, obiekt jest klasy Student, a compareTo jest też w klasie Student, więc widać wszystkie jego składowe.
Student st: studenci" co oznacza ??
import java.util.Comparator;
public class ComparatorPart implements Comparator{
@Override
public int compare(Part o1, Part o2) {
int ilosc = o1.getQuantity() - o2.getQuantity();
if(ilosc == 0) {
return o1.compareTo(o2);
}
return ilosc;
}
}
swietny material
Prześlij komentarz
Możesz użyć niektórych tagów HTML, takich jak <b>, <i>, <u>, <a> Nie spamuj :)