Interfaccia Comparator
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 45 di 87.
Mentre Comparable definisce l'ordinamento naturale di una classe, a volte è necessario ordinare gli oggetti in modi diversi. L'interfaccia Comparator ti permette di creare logiche di confronto separate senza modificare la classe originale.
Un Comparator è un oggetto esterno che confronta due oggetti dello stesso tipo. È utile quando vuoi avere più opzioni di ordinamento o quando non puoi modificare la classe stessa:
import java.util.Comparator;
class NameComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
}
class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
}Puoi quindi passare il comparatore ai metodi di ordinamento:
List<Person> people = new ArrayList<>();
people.add(new Person("Charlie", 30));
people.add(new Person("Alice", 25));
Collections.sort(people, new NameComparator()); // Ordinato per nome
Collections.sort(people, new AgeComparator()); // Ordinato per etàPer scrivere codice conciso, puoi usare le espressioni lambda perché Comparator è un'interfaccia funzionale:
Collections.sort(people, (p1, p2) -> p1.getName().compareTo(p2.getName()));La differenza fondamentale: Comparable è implementato dalla classe da confrontare e definisce un unico ordinamento naturale, mentre Comparator è una classe separata che può definire un numero illimitato di ordinamenti personalizzati.
Sfida
FacileCostruiamo un sistema di ordinamento dei dipendenti che dimostri la potenza dell'interfaccia Comparator. Creerai più comparatori per ordinare i dipendenti in modi diversi, per stipendio e per nome, senza modificare la classe Employee.
Organizzerai il codice in quattro file:
Employee.java: Crea una classe che rappresenti un dipendente con tre campi privati:name(String),department(String) esalary(double). Includi un costruttore per inizializzare tutti i campi e i metodi getter per ciascuno. SovrascrivitoString()affinché restituisca:[name] ([department]) - $[salary]SalaryComparator.java: Crea un comparatore che ordini i dipendenti per stipendio in ordine decrescente (dal più pagato al meno pagato). Implementa l'interfacciaComparator<Employee>e il relativo metodocompare(). UsaDouble.compare()per confrontare in modo sicuro i valori degli stipendi.NameComparator.java: Crea un altro comparatore che ordini alfabeticamente i dipendenti per nome in ordine crescente (dalla A alla Z). ImplementaComparator<Employee>e usa il metodocompareTo()di String per il confronto.Main.java: Metti tutto insieme creando una lista di dipendenti e ordinandola usando i tuoi comparatori. Riceverai i dati di tre dipendenti, ciascuno su una riga separata nel formato:name,department,salaryCrea un
ArrayListdi dipendenti, quindi mostra entrambi i metodi di ordinamento:- Per prima cosa, ordina per stipendio usando il tuo
SalaryComparatore stampa ogni dipendente - Stampa una riga vuota
- Quindi ordina per nome usando il tuo
NameComparatore stampa ogni dipendente
- Per prima cosa, ordina per stipendio usando il tuo
Riceverai tre righe di input, ciascuna contenente i dati di un dipendente nel formato: name,department,salary
Ad esempio, una riga di input potrebbe essere così: Alice,Engineering,75000.0
Ricorda di importare java.util.Comparator nei file dei comparatori e java.util.ArrayList, java.util.Collections e java.util.Scanner nel file Main. Nota come i comparatori ti consentano di definire esternamente più strategie di ordinamento: la classe Employee non deve sapere nulla di come potrebbe essere ordinata!
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 dipendenti dall'input
// Formato di ogni riga: name,department,salary
String line1 = scanner.nextLine();
String line2 = scanner.nextLine();
String line3 = scanner.nextLine();
// TODO: Analizza ogni riga e crea oggetti Employee
// Suggerimento: usa split(",") per separare i valori
// TODO: Crea un ArrayList di dipendenti e aggiungi tutti e tre
// TODO: Ordina per stipendio usando SalaryComparator e stampa ogni dipendente
// Suggerimento: usa Collections.sort(list, comparator)
// TODO: Stampa una riga vuota
// TODO: Ordina per nome usando NameComparator e stampa ogni dipendente
}
}
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