Porównujemy obiekty - interfejs Comparable<T>

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.* Klasa Student
03.* Przykład wykorzystania interfejsu Comparable<T>
04.* @author kodatnik.blogspot.com
05.*/
06. 
07.// klasa Student implementuje interfejs Comparable<T>
08.// czyli musi mieć wszystkie metody związane z tym interfejsem
09.class Student implements Comparable<Student> {
10. // pola prywatne
11. private String imie;
12. private String nazwisko;
13. private int nrAlbumu;
14. 
15. // konstruktor klasy
16. public Student(String imie, String nazwisko, int nrAlbumu) {
17.  this.imie = imie;
18.  this.nazwisko = nazwisko;
19.  this.nrAlbumu = nrAlbumu;
20. }
21. 
22. // metoda wymagana przez interfejs Comparable<T>
23. public int compareTo(Student obiekt) {
24.  // zwracamy wynik porównania dwóch pól nazwisko
25.  // (korzystamy z porównania dostępnego w klasie String)
26.  return nazwisko.compareTo(obiekt.nazwisko);
27. }
28. 
29. // metoda przesłonięta, zwraca nam tekstową reprezentację obiektu
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.* Klasa TestPorownania
03.* Przykład wykorzystania klasy implementującej interfejs Comparable<T>
04.* @author kodatnik.blogspot.com
05.*/
06. 
07.// wykorzystujemy klasę Arrays (obsługa tablic)
08.import java.util.Arrays;
09. 
10.public class TestPorownania {
11. public static void main(String[] args) {
12.  // tworzymy tablicę studentów o rozmiarze 6
13.  Student[] studenci = new Student[6];
14. 
15.  // wypełniamy poszczególne elementy tablicy obiektami typu Student
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.  // sortujemy tablicę za pomocą metody sort dostępnej w klasie Arrays
24.  // elementy tablicy zostaną posortowane według metody compareTo()
25.  Arrays.sort(studenci);
26. 
27.  // wyświetlamy zawartość posortowanej tablicy
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. // jeżeli nazwiska są takie same
03. if (nazwisko.compareTo(obiekt.nazwisko) == 0)
04.  // sprawdzamy imiona
05.  if(imie.compareTo(obiekt.imie) == 0)
06.   // jeśli są takie same zwracamy różnicę z numerów albumu (dla takich samych będzie to zero)
07.   return nrAlbumu - obiekt.nrAlbumu;
08.  else
09.   // w przeciwnym wypadku zwracamy porównanie imion
10.   return imie.compareTo(obiekt.imie);
11. else
12.  // w przeciwnym wypadku zwracamy porównanie nazwisk
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


7 Komentarzy - Porównujemy obiekty - interfejs Comparable<T>

Interfejs pisze...

Bardzo Ciekawy artykuł na temat
Interfejs, można się ciekawych rzeczy dowiedzieć ;D

Anonimowy pisze...

Dzięki za wrzutkę

Anonimowy pisze...

Skoro nazwisko ma zasięg private to dlaczego możemy odwołaś się do niego w metodzie compareTo poprzez obiekt.nazwisko?

Anonimowy pisze...

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.

Unknown pisze...

Student st: studenci" co oznacza ??

Anonimowy pisze...

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;

}

}

obiady domowe z dostawą Rybnik pisze...

swietny material

Prześlij komentarz

Możesz użyć niektórych tagów HTML, takich jak <b>, <i>, <u>, <a> Nie spamuj :)

Popularne posty