Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Comparator: Confronto Personalizzato Dei Dati | Fondamenti e Capacità Funzionali dello Stream API
Stream API

bookComparator: Confronto Personalizzato Dei Dati

Analisi della seconda interfaccia funzionale, Comparator, esame dell'implementazione del confronto e comprensione della differenza tra Comparator e Comparable.

Che cos'è Comparator?

Il metodo chiave nell'interfaccia funzionale Comparator è:

int compare(T o1, T o2);

Il metodo compare(T o1, T o2) restituisce:

  • Un numero negativo se o1 è minore di o2;
  • Zero se o1 e o2 sono uguali;
  • Un numero positivo se o1 è maggiore di o2.

Applicazione pratica

Implementazione dell'ordinamento di oggetti Book utilizzando l'interfaccia Comparator. Invece di implementare il metodo di confronto all'interno della classe Book, si utilizzano i metodi statici dell'interfaccia Comparator per definire la logica di ordinamento.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
package com.example; import java.util.List; import java.util.ArrayList; import java.util.Comparator; public class Main { public static void main(String[] args) { List<Book> books = new ArrayList<>(); books.add(new Book("The Great Gatsby", "F. Scott Fitzgerald", 1925)); books.add(new Book("To Kill a Mockingbird", "Harper Lee", 1960)); books.add(new Book("1984", "George Orwell", 1949)); // Sort by title books.sort(Comparator.comparing(Book::getTitle)); System.out.println("Sorted by title: " + books); System.out.println("------------------------"); // Sort by author books.sort(Comparator.comparing(Book::getAuthor)); System.out.println("Sorted by author: " + books); } } class Book { private String title; private String author; private int year; public Book(String title, String author, int year) { this.title = title; this.author = author; this.year = year; } public String getTitle() { return title; } public String getAuthor() { return author; } public int getYear() { return year; } @Override public String toString() { return title + " by " + author + " (" + year + ")"; } }

In questo esempio, viene utilizzata l'interfaccia Comparator per ordinare la lista books. Ma perché è stato utilizzato il metodo comparing() invece di compare()?

Se si desidera utilizzare il metodo compare(), è necessario creare un oggetto Comparator e implementare il metodo compare.

public static Comparator<Book> titleComparator = new Comparator<Book>() {
    @Override
    public int compare(Book b1, Book b2) {
        return b1.getTitle().compareTo(b2.getTitle());
    }
};

Questo codice definisce un Comparator<Book> utilizzando una classe anonima per confrontare due oggetti Book in base al loro title.

Poiché String implementa Comparable, il metodo compareTo() viene utilizzato per confrontare i titoli in modo lessicografico, restituendo un valore negativo, zero o positivo.

In alternativa, è possibile ottenere lo stesso risultato con una espressione lambda per un'implementazione più concisa:

(b1, b2) -> b1.getTitle().compareTo(b2.getTitle());

Ma esiste un approccio ancora più semplice: utilizzare il metodo Comparator.comparing(). Questo metodo gestisce automaticamente la logica di confronto, rendendo il codice più leggibile e conciso.

È sufficiente passare un riferimento a un metodo che estrae il campo da confrontare.

Comparator.comparing(Book::getTitle)

Il metodo sort() della lista richiama il Comparator passato, che a sua volta determina l'ordine degli elementi confrontandoli in base ai valori restituiti dai metodi specificati.

Ordinamento Multiplo

Se è necessario ordinare secondo criteri multipli, è possibile utilizzare il metodo thenComparing:

books.sort(
       Comparator.comparing(Book::getYear) // First by year
           .thenComparing(Book::getTitle) // Then by title
);

Questo esempio mostra come ordinare una lista di libri prima per il loro year di pubblicazione e poi per title. Il processo di ordinamento confronta inizialmente i libri in base al loro year e, se due libri hanno lo stesso year, li confronta successivamente per title per determinare l'ordine finale.

Ordinamento Inverso

Invertire l'ordine di ordinamento in Java è utile quando è necessario ordinare gli elementi prima secondo un criterio e poi cambiare l'ordine per il criterio successivo.

I metodi reversed() e Comparator.reverseOrder() aiutano a controllare la direzione dell'ordinamento, ma funzionano in modo diverso.

books.sort(
    Comparator.comparing(Book::getYear).reversed() // Sort by year (descending)
        .thenComparing(Book::getTitle, Comparator.reverseOrder()) // Then by title (descending)
);

I libri vengono prima ordinati per anno di pubblicazione in ordine decrescente utilizzando reversed(). Se più libri condividono lo stesso year, thenComparing() li ordina per title in ordine alfabetico inverso tramite Comparator.reverseOrder().

Questo garantisce che i libri più recenti compaiano per primi e, all'interno dello stesso anno, le titoli siano ordinati dalla Z alla A.

Differenze tra Comparable e Comparator

Utilizzare l'interfaccia Comparable quando una classe ha un ordinamento naturale, come l'ordinamento per un singolo campo. Utilizzare Comparator quando si ordina per criteri multipli o quando è necessario definire un ordinamento personalizzato per gli oggetti.

1. Quando utilizzare l'interfaccia Comparable?

2. Quando utilizzare l'interfaccia Comparator?

question mark

Quando utilizzare l'interfaccia Comparable?

Select the correct answer

question mark

Quando utilizzare l'interfaccia Comparator?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 1. Capitolo 9

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Suggested prompts:

Can you explain the main differences between Comparator and Comparable?

How do I choose between using Comparator and Comparable in my code?

Can you show an example of sorting with Comparable?

Awesome!

Completion rate improved to 2.33

bookComparator: Confronto Personalizzato Dei Dati

Scorri per mostrare il menu

Analisi della seconda interfaccia funzionale, Comparator, esame dell'implementazione del confronto e comprensione della differenza tra Comparator e Comparable.

Che cos'è Comparator?

Il metodo chiave nell'interfaccia funzionale Comparator è:

int compare(T o1, T o2);

Il metodo compare(T o1, T o2) restituisce:

  • Un numero negativo se o1 è minore di o2;
  • Zero se o1 e o2 sono uguali;
  • Un numero positivo se o1 è maggiore di o2.

Applicazione pratica

Implementazione dell'ordinamento di oggetti Book utilizzando l'interfaccia Comparator. Invece di implementare il metodo di confronto all'interno della classe Book, si utilizzano i metodi statici dell'interfaccia Comparator per definire la logica di ordinamento.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
package com.example; import java.util.List; import java.util.ArrayList; import java.util.Comparator; public class Main { public static void main(String[] args) { List<Book> books = new ArrayList<>(); books.add(new Book("The Great Gatsby", "F. Scott Fitzgerald", 1925)); books.add(new Book("To Kill a Mockingbird", "Harper Lee", 1960)); books.add(new Book("1984", "George Orwell", 1949)); // Sort by title books.sort(Comparator.comparing(Book::getTitle)); System.out.println("Sorted by title: " + books); System.out.println("------------------------"); // Sort by author books.sort(Comparator.comparing(Book::getAuthor)); System.out.println("Sorted by author: " + books); } } class Book { private String title; private String author; private int year; public Book(String title, String author, int year) { this.title = title; this.author = author; this.year = year; } public String getTitle() { return title; } public String getAuthor() { return author; } public int getYear() { return year; } @Override public String toString() { return title + " by " + author + " (" + year + ")"; } }

In questo esempio, viene utilizzata l'interfaccia Comparator per ordinare la lista books. Ma perché è stato utilizzato il metodo comparing() invece di compare()?

Se si desidera utilizzare il metodo compare(), è necessario creare un oggetto Comparator e implementare il metodo compare.

public static Comparator<Book> titleComparator = new Comparator<Book>() {
    @Override
    public int compare(Book b1, Book b2) {
        return b1.getTitle().compareTo(b2.getTitle());
    }
};

Questo codice definisce un Comparator<Book> utilizzando una classe anonima per confrontare due oggetti Book in base al loro title.

Poiché String implementa Comparable, il metodo compareTo() viene utilizzato per confrontare i titoli in modo lessicografico, restituendo un valore negativo, zero o positivo.

In alternativa, è possibile ottenere lo stesso risultato con una espressione lambda per un'implementazione più concisa:

(b1, b2) -> b1.getTitle().compareTo(b2.getTitle());

Ma esiste un approccio ancora più semplice: utilizzare il metodo Comparator.comparing(). Questo metodo gestisce automaticamente la logica di confronto, rendendo il codice più leggibile e conciso.

È sufficiente passare un riferimento a un metodo che estrae il campo da confrontare.

Comparator.comparing(Book::getTitle)

Il metodo sort() della lista richiama il Comparator passato, che a sua volta determina l'ordine degli elementi confrontandoli in base ai valori restituiti dai metodi specificati.

Ordinamento Multiplo

Se è necessario ordinare secondo criteri multipli, è possibile utilizzare il metodo thenComparing:

books.sort(
       Comparator.comparing(Book::getYear) // First by year
           .thenComparing(Book::getTitle) // Then by title
);

Questo esempio mostra come ordinare una lista di libri prima per il loro year di pubblicazione e poi per title. Il processo di ordinamento confronta inizialmente i libri in base al loro year e, se due libri hanno lo stesso year, li confronta successivamente per title per determinare l'ordine finale.

Ordinamento Inverso

Invertire l'ordine di ordinamento in Java è utile quando è necessario ordinare gli elementi prima secondo un criterio e poi cambiare l'ordine per il criterio successivo.

I metodi reversed() e Comparator.reverseOrder() aiutano a controllare la direzione dell'ordinamento, ma funzionano in modo diverso.

books.sort(
    Comparator.comparing(Book::getYear).reversed() // Sort by year (descending)
        .thenComparing(Book::getTitle, Comparator.reverseOrder()) // Then by title (descending)
);

I libri vengono prima ordinati per anno di pubblicazione in ordine decrescente utilizzando reversed(). Se più libri condividono lo stesso year, thenComparing() li ordina per title in ordine alfabetico inverso tramite Comparator.reverseOrder().

Questo garantisce che i libri più recenti compaiano per primi e, all'interno dello stesso anno, le titoli siano ordinati dalla Z alla A.

Differenze tra Comparable e Comparator

Utilizzare l'interfaccia Comparable quando una classe ha un ordinamento naturale, come l'ordinamento per un singolo campo. Utilizzare Comparator quando si ordina per criteri multipli o quando è necessario definire un ordinamento personalizzato per gli oggetti.

1. Quando utilizzare l'interfaccia Comparable?

2. Quando utilizzare l'interfaccia Comparator?

question mark

Quando utilizzare l'interfaccia Comparable?

Select the correct answer

question mark

Quando utilizzare l'interfaccia Comparator?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 1. Capitolo 9
some-alt