compareTo() i Comparable
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 44 z 87.
Interfejs Comparable pozwala obiektom definiować ich naturalny porządek. Implementując ten interfejs, możesz automatycznie sortować swoją klasę za pomocą metod takich jak Collections.sort() lub przechowywać jej obiekty w posortowanych kolekcjach, takich jak TreeSet.
Interfejs wymaga zaimplementowania jednej metody: compareTo(). Ta metoda porównuje bieżący obiekt z innym obiektem i zwraca liczbę całkowitą wskazującą ich kolejność względem siebie:
- Wartość ujemna: ten obiekt jest przed drugim
- Zero: oba obiekty są równe
- Wartość dodatnia: ten obiekt jest po drugim
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age); // Sortuj według wieku rosnąco
}
}Po zaimplementowaniu sortowanie staje się proste:
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people); // Teraz posortowane według wieku: Bob, AliceDo porównywania ciągów znaków lub innych pól implementujących Comparable możesz delegować porównanie do ich metody compareTo() zamiast używać odejmowania: return this.name.compareTo(other.name);. To podejście jest bezpieczniejsze i prawidłowo obsługuje przypadki brzegowe. W przypadku pól typu int preferuj Integer.compare(a, b) zamiast a - b, ponieważ odejmowanie może powodować przepełnienie dla skrajnych wartości.
Wyzwanie
ŁatwyZbudujmy system rankingu filmów, który używa interfejsu Comparable do sortowania filmów według ocen. Utworzysz klasę Movie, która potrafi porównywać się z innymi filmami, umożliwiając automatyczne sortowanie od najwyżej do najniżej ocenianych.
Rozmieścisz swój kod w dwóch plikach:
Movie.java: Utwórz klasę reprezentującą film, który można porównywać z innymi filmami. Film ma trzy pola prywatne:title(String),director(String) irating(double, od 0.0 do 10.0). Dodaj konstruktor inicjalizujący wszystkie pola oraz metody pobierające wartości każdego z nich.Zaimplementuj w klasie Movie interfejs
Comparable<Movie>i nadpisz metodęcompareTo(). Filmy powinny być sortowane według oceny w kolejności malejącej (najwyżej oceniany film jako pierwszy). Przy porównywaniu wartości typu double użyjDouble.compare(), aby bezpiecznie je porównać: pamiętaj, aby odwrócić kolejność przy sortowaniu malejącym!Nadpisz
toString(), aby zwracała:[title] by [director] - Rating: [rating]Main.java: Ożyw swoją klasę Movie, tworząc listę filmów i sortując ją. Otrzymasz dane wejściowe dla trzech filmów, każdy w osobnym wierszu, w formacie:title,director,ratingPrzetwórz każdy wiersz, aby utworzyć obiekty Movie, dodaj je do
ArrayList, a następnie użyjCollections.sort(), aby posortować listę. Dzięki implementacji interfejsuComparablefilmy automatycznie ustawią się według oceny!Po sortowaniu wypisz każdy film w osobnym wierszu, używając formatu
toString(). Najwyżej oceniany film powinien pojawić się jako pierwszy.
Otrzymasz trzy wiersze danych wejściowych, każdy zawierający dane filmu w formacie: title,director,rating
Przykładowy wiersz danych wejściowych może wyglądać tak: Inception,Christopher Nolan,8.8
Pamiętaj, aby zaimportować java.util.ArrayList, java.util.Collections i java.util.Scanner w pliku Main. Zauważ, że implementacja interfejsu Comparable pozwala sortować własne obiekty za pomocą jednego wywołania metody: nie potrzebujesz dodatkowego komparatora!
Spróbuj swoich sił
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Wczytaj trzy wiersze danych o filmach
String line1 = scanner.nextLine();
String line2 = scanner.nextLine();
String line3 = scanner.nextLine();
// TODO: Utwórz ArrayList do przechowywania obiektów Movie
// TODO: Przetwórz każdy wiersz (format: title,director,rating)
// Wskazówka: Użyj split(",") do rozdzielenia części
// Wskazówka: Użyj Double.parseDouble() do przetworzenia oceny
// TODO: Utwórz obiekty Movie i dodaj je do listy
// TODO: Posortuj listę za pomocą Collections.sort()
// TODO: Wypisz każdy film (po jednym w wierszu)
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online