Menu
Coddy logo textTech

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, Alice

Per 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.

challenge icon

Sfida

Facile

Costruiamo 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) e rating (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 metodo compareTo(). I film devono essere ordinati per valutazione in ordine decrescente (prima quello con la valutazione più alta). Quando confronti valori double, usa Double.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,rating

    Analizza ogni riga per creare oggetti Movie, aggiungili a un ArrayList, poi usa Collections.sort() per ordinare la lista. Grazie alla tua implementazione di Comparable, 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)
    }
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Java online