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

0

Hej

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

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

I kod gdzie mam tablicę obiektów:

		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ć?

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

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)

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.

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?

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1