compareTo() e Comparable
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 44 di 87.
L’interfaccia Comparable consente agli oggetti di definire il proprio ordinamento naturale. Implementando questa interfaccia, la tua classe può essere ordinata automaticamente usando metodi come Collections.sort() oppure memorizzata in collezioni ordinate come TreeSet.
L'interfaccia richiede di implementare un solo metodo: compareTo(). Questo metodo confronta l'oggetto corrente con un altro oggetto e restituisce un intero che indica il loro ordine relativo:
- Valore negativo: questo oggetto viene prima dell'altro
- Zero: i due oggetti sono uguali
- Valore positivo: questo oggetto viene dopo l'altro
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); // Ordina per età in ordine crescente
}
}Una volta implementato, ordinare diventa semplice:
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people); // Ora ordinati per età: Bob, AlicePer confrontare stringhe o altri campi Comparable, puoi delegare al loro metodo compareTo() invece di usare la sottrazione: return this.name.compareTo(other.name);. Questo approccio è più sicuro e gestisce correttamente i casi limite. Per i campi int, preferisci Integer.compare(a, b) a a - b, perché la sottrazione può causare un overflow con valori estremi.
Sfida
FacileCostruiamo un sistema di classificazione dei film che utilizza l'interfaccia Comparable per ordinare i film in base alle loro valutazioni. Creerai una classe Movie che sa come confrontarsi con altri film, consentendo l'ordinamento automatico dal voto più alto al più basso.
Organizzerai il codice in due file:
Movie.java: Crea una classe che rappresenta un film e che può essere confrontata con altri film. Un Movie ha tre campi privati:title(String),director(String) erating(double, da 0.0 a 10.0). Includi un costruttore per inizializzare tutti i campi e metodi getter per ciascuno.Fai implementare alla tua classe Movie l'interfaccia
Comparable<Movie>e sovrascrivi il metodocompareTo(). I film devono essere ordinati per valutazione in ordine decrescente (prima quello con la valutazione più alta). Quando confronti valori double, usaDouble.compare()per un confronto sicuro: ricorda di invertire l'ordine per l'ordinamento decrescente!Sovrascrivi
toString()affinché restituisca:[title] by [director] - Rating: [rating]Main.java: Dai vita alla tua classe Movie creando una lista di film e ordinandoli. Riceverai i dati di tre film in input, ciascuno su una riga separata, nel formato:title,director,ratingAnalizza ogni riga per creare oggetti Movie, aggiungili a un
ArrayList, poi usaCollections.sort()per ordinare la lista. Grazie alla tua implementazione diComparable, i film si ordineranno automaticamente in base alla valutazione!Dopo aver ordinato la lista, stampa ogni film su una riga separata usando il formato di
toString(). Il film con la valutazione più alta deve comparire per primo.
Riceverai tre righe di input, ciascuna contenente i dati di un film nel formato: title,director,rating
Per esempio, una riga di input potrebbe essere: Inception,Christopher Nolan,8.8
Ricorda di importare java.util.ArrayList, java.util.Collections e java.util.Scanner nel tuo file Main. Nota come implementare Comparable ti consenta di ordinare i tuoi oggetti personalizzati con una sola chiamata di metodo: non serve alcun comparatore aggiuntivo!
Provalo tu
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);
// Leggi tre righe di dati sui film
String line1 = scanner.nextLine();
String line2 = scanner.nextLine();
String line3 = scanner.nextLine();
// TODO: Crea un ArrayList per memorizzare oggetti Movie
// TODO: Analizza ogni riga (formato: title,director,rating)
// Suggerimento: usa split(",") per separare le parti
// Suggerimento: usa Double.parseDouble() per il punteggio
// TODO: Crea oggetti Movie e aggiungili alla lista
// TODO: Ordina la lista usando Collections.sort()
// TODO: Stampa ogni film (uno per riga)
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online