Porównywanie obiektów z użyciem interfejsu Comparable

Porównywanie obiektów z użyciem interfejsu Comparable
RU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
0

Hej

Mam kod porównujący pole napis (String) z danego obiektu:

Kopiuj
	public int compareTo(T2 o) 
	{
		return napis.compareTo(o.napis);
	}

I kod gdzie mam tablicę obiektów:

Kopiuj
		T2[] tablica = new T2[2];
		tablica[0] = new T2(20, "B");
		tablica[1] = new T2(11, "A");
		Arrays.sort(tablica);
		for(T2 temp : tablica)
		{
			System.out.println(temp);
		}

Nie rozumiem jak działa ta linijka napis.compareTo(o.napis);.
Tutaj o.napis biorę pole z pierwszego przekazanego obiektu? A co jest przekazywane tutaj napis.compareTo - skąd kompilator wie jakie pole tutaj użyć?

Manuel.Artificer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 177
1

tak jak napisałeś pole napis jest typu string a typ string również zawiera metodę compareTo, dzięki czemu pisząc taki kod

Kopiuj
napis.compareTo(o.napis)

porównujesz string ze stringiem

No i teraz metoda sort pobiera pierwszy obiekt z tablicy i wywołuje na nim metodę compareTo przekazując do niej następny obiekt i tak do czasu aż posortuje wszystkie obiekty: Tutaj takie zobrazowanie jak to wygląda (to co wykonuje metoda sort)

Kopiuj
int wynik = tablica[0].compareTo(tablica[1])
//w zależności od zwróconej wartości zostanie ustalone położenie danego obiektu
tablica[1].compareTo(tablica[2]) itd.

tablica[0] to obiekt typu T2 (żeby nie mieszać niech będzie że to obiekt) więc zawiera pole napis i te pole napis z tablica[0] jest porównywane z polem napis obiektu tablica[1] itd.

RU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
0

A jak to się dzieje, że w miejscu napis.compareTo(o.napis);, kompilator wie, że ma przyjąć pole napis z pierwszego obiektu? Czy nie powinno to wyglądać w ten sposób o.napis.compareTo(o.napis); (ewentualnie z podaniem numeru elementu tablicy)?

Tak jak w tym przykładzie napis1.compareTo(napis2) jawnie deklaruje, że chodzi mi o zmienną napis1.

Wynika to ze specyfiki metody compareTo i dzieje się to w sposób niejawny?

nalik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1039
1

Zmienna napis istnieje wewnątrz obiektu danej klasy. Metoda compareTo jest zdefiniowana dla tej klasy.
Kompilator wie, że używając zmiennej napis w metodzie compareTo chodzi Ci o tą zmienną z tego obiektu, na którym wywołałeś metodę.

Taki zapis: o.napis.compareTo(o.napis) jest błędny, bo porównuje napis z obiektu o z napisem z obiektu o, czyli te same zmienne.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.