Comparator: Aangepaste Vergelijking van Gegevens
Laten we de tweede functionele interface, Comparator, bekijken, zien hoe deze vergelijking implementeert en het verschil tussen Comparator en Comparable begrijpen.
Wat is Comparator?
De belangrijkste methode in de functionele interface Comparator is:
int compare(T o1, T o2);
De methode compare(T o1, T o2) retourneert:
- Een negatief getal als
o1kleiner is dano2; - Nul als
o1eno2gelijk zijn; - Een positief getal als
o1groter is dano2.
Praktische Toepassing
Implementeer het sorteren van Book-objecten met behulp van de interface Comparator. In plaats van de vergelijkingsmethode binnen de klasse Book zelf te implementeren, gebruik je statische methoden van de interface Comparator om de sorteerlogica te definiëren.
Main.java
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253package 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 dit voorbeeld wordt de Comparator-interface gebruikt om de lijst books te sorteren. Maar waarom is de comparing()-methode gebruikt in plaats van compare()?
Als je de compare()-methode wilt gebruiken, moet je een Comparator-object aanmaken en de compare-methode implementeren.
public static Comparator<Book> titleComparator = new Comparator<Book>() {
@Override
public int compare(Book b1, Book b2) {
return b1.getTitle().compareTo(b2.getTitle());
}
};
Deze code definieert een Comparator<Book> met behulp van een anonieme klasse om twee Book-objecten te vergelijken op basis van hun title.
Aangezien String de Comparable-interface implementeert, wordt de compareTo()-methode gebruikt om de titels lexicografisch te vergelijken, wat een negatieve, nul of positieve waarde oplevert.
Als alternatief kan hetzelfde resultaat worden bereikt met een lambda-expressie voor een meer beknopte implementatie:
(b1, b2) -> b1.getTitle().compareTo(b2.getTitle());
Maar er is een nog eenvoudigere benadering: het gebruik van de methode Comparator.comparing(). Deze methode regelt automatisch de vergelijkingslogica voor je, waardoor het leesbaarder en bondiger wordt.
Je geeft eenvoudigweg een methode-referentie door die het veld voor vergelijking extraheert.
Comparator.comparing(Book::getTitle)
De methode sort() van de lijst roept de meegegeven Comparator aan, die op zijn beurt de volgorde van elementen bepaalt door ze te vergelijken op basis van de waarden die door de opgegeven methoden worden geretourneerd.
Meervoudig Sorteren
Indien sortering op meerdere criteria vereist is, kan de thenComparing-methode worden gebruikt:
books.sort(
Comparator.comparing(Book::getYear) // First by year
.thenComparing(Book::getTitle) // Then by title
);
Dit voorbeeld toont hoe een lijst van boeken eerst op hun uitgaveyear en vervolgens op title kan worden gesorteerd. Het sorteerproces vergelijkt de boeken eerst op basis van hun year, en als twee boeken hetzelfde year hebben, worden ze op title vergeleken om de definitieve volgorde te bepalen.
Omgekeerd Sorteren
Het omkeren van de sorteervolgorde in Java is nuttig wanneer elementen eerst op één criterium gesorteerd moeten worden en vervolgens de volgorde voor het volgende criterium gewijzigd moet worden.
De reversed()- en Comparator.reverseOrder()-methoden bieden controle over de sorteerrichting, maar functioneren verschillend.
books.sort(
Comparator.comparing(Book::getYear).reversed() // Sort by year (descending)
.thenComparing(Book::getTitle, Comparator.reverseOrder()) // Then by title (descending)
);
De boeken worden eerst gesorteerd op hun uitgavejaar in aflopende volgorde met behulp van reversed(). Als meerdere boeken hetzelfde year hebben, sorteert thenComparing() ze op title in omgekeerde alfabetische volgorde met behulp van Comparator.reverseOrder().
Hierdoor verschijnen de meest recente boeken eerst en worden binnen hetzelfde jaar de titels van Z tot A gerangschikt.
Verschillen tussen Comparable en Comparator
Gebruik de Comparable interface wanneer een klasse een natuurlijke ordening heeft, zoals sorteren op een enkel veld. Gebruik Comparator wanneer er op meerdere criteria gesorteerd moet worden of wanneer een aangepaste volgorde voor objecten vereist is.
1. Wanneer de Comparable-interface gebruiken?
2. Wanneer de Comparator-interface gebruiken?
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Awesome!
Completion rate improved to 2.33
Comparator: Aangepaste Vergelijking van Gegevens
Veeg om het menu te tonen
Laten we de tweede functionele interface, Comparator, bekijken, zien hoe deze vergelijking implementeert en het verschil tussen Comparator en Comparable begrijpen.
Wat is Comparator?
De belangrijkste methode in de functionele interface Comparator is:
int compare(T o1, T o2);
De methode compare(T o1, T o2) retourneert:
- Een negatief getal als
o1kleiner is dano2; - Nul als
o1eno2gelijk zijn; - Een positief getal als
o1groter is dano2.
Praktische Toepassing
Implementeer het sorteren van Book-objecten met behulp van de interface Comparator. In plaats van de vergelijkingsmethode binnen de klasse Book zelf te implementeren, gebruik je statische methoden van de interface Comparator om de sorteerlogica te definiëren.
Main.java
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253package 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 dit voorbeeld wordt de Comparator-interface gebruikt om de lijst books te sorteren. Maar waarom is de comparing()-methode gebruikt in plaats van compare()?
Als je de compare()-methode wilt gebruiken, moet je een Comparator-object aanmaken en de compare-methode implementeren.
public static Comparator<Book> titleComparator = new Comparator<Book>() {
@Override
public int compare(Book b1, Book b2) {
return b1.getTitle().compareTo(b2.getTitle());
}
};
Deze code definieert een Comparator<Book> met behulp van een anonieme klasse om twee Book-objecten te vergelijken op basis van hun title.
Aangezien String de Comparable-interface implementeert, wordt de compareTo()-methode gebruikt om de titels lexicografisch te vergelijken, wat een negatieve, nul of positieve waarde oplevert.
Als alternatief kan hetzelfde resultaat worden bereikt met een lambda-expressie voor een meer beknopte implementatie:
(b1, b2) -> b1.getTitle().compareTo(b2.getTitle());
Maar er is een nog eenvoudigere benadering: het gebruik van de methode Comparator.comparing(). Deze methode regelt automatisch de vergelijkingslogica voor je, waardoor het leesbaarder en bondiger wordt.
Je geeft eenvoudigweg een methode-referentie door die het veld voor vergelijking extraheert.
Comparator.comparing(Book::getTitle)
De methode sort() van de lijst roept de meegegeven Comparator aan, die op zijn beurt de volgorde van elementen bepaalt door ze te vergelijken op basis van de waarden die door de opgegeven methoden worden geretourneerd.
Meervoudig Sorteren
Indien sortering op meerdere criteria vereist is, kan de thenComparing-methode worden gebruikt:
books.sort(
Comparator.comparing(Book::getYear) // First by year
.thenComparing(Book::getTitle) // Then by title
);
Dit voorbeeld toont hoe een lijst van boeken eerst op hun uitgaveyear en vervolgens op title kan worden gesorteerd. Het sorteerproces vergelijkt de boeken eerst op basis van hun year, en als twee boeken hetzelfde year hebben, worden ze op title vergeleken om de definitieve volgorde te bepalen.
Omgekeerd Sorteren
Het omkeren van de sorteervolgorde in Java is nuttig wanneer elementen eerst op één criterium gesorteerd moeten worden en vervolgens de volgorde voor het volgende criterium gewijzigd moet worden.
De reversed()- en Comparator.reverseOrder()-methoden bieden controle over de sorteerrichting, maar functioneren verschillend.
books.sort(
Comparator.comparing(Book::getYear).reversed() // Sort by year (descending)
.thenComparing(Book::getTitle, Comparator.reverseOrder()) // Then by title (descending)
);
De boeken worden eerst gesorteerd op hun uitgavejaar in aflopende volgorde met behulp van reversed(). Als meerdere boeken hetzelfde year hebben, sorteert thenComparing() ze op title in omgekeerde alfabetische volgorde met behulp van Comparator.reverseOrder().
Hierdoor verschijnen de meest recente boeken eerst en worden binnen hetzelfde jaar de titels van Z tot A gerangschikt.
Verschillen tussen Comparable en Comparator
Gebruik de Comparable interface wanneer een klasse een natuurlijke ordening heeft, zoals sorteren op een enkel veld. Gebruik Comparator wanneer er op meerdere criteria gesorteerd moet worden of wanneer een aangepaste volgorde voor objecten vereist is.
1. Wanneer de Comparable-interface gebruiken?
2. Wanneer de Comparator-interface gebruiken?
Bedankt voor je feedback!