Comparador: Comparação Personalizada de Dados
Vamos analisar a segunda interface funcional, Comparator, observar como ela implementa a comparação e compreender a diferença entre Comparator e Comparable.
O que é Comparator?
O método principal na interface funcional Comparator é:
int compare(T o1, T o2);
O método compare(T o1, T o2) retorna:
- Um número negativo se
o1for menor queo2; - Zero se
o1eo2forem iguais; - Um número positivo se
o1for maior queo2.
Aplicação Prática
Implementação da ordenação de objetos Book utilizando a Comparator interface. Em vez de implementar o método de comparação diretamente na classe Book, utilize métodos estáticos do Comparator interface para definir a lógica de ordenação.
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 + ")"; } }
Neste exemplo, utiliza-se a interface Comparator para ordenar a lista books. Mas por que foi utilizado o método comparing() em vez de compare()?
Para utilizar o método compare(), é necessário criar um Comparator e implementar o método compare.
public static Comparator<Book> titleComparator = new Comparator<Book>() {
@Override
public int compare(Book b1, Book b2) {
return b1.getTitle().compareTo(b2.getTitle());
}
};
Este código define um Comparator<Book> utilizando uma classe anônima para comparar dois objetos Book pelo seu title.
Como String implementa Comparable, o método compareTo() é utilizado para comparar os títulos lexicograficamente, retornando um valor negativo, zero ou positivo.
Alternativamente, é possível obter o mesmo resultado com uma expressão lambda para uma implementação mais concisa:
(b1, b2) -> b1.getTitle().compareTo(b2.getTitle());
Mas existe uma abordagem ainda mais simples: utilizar o método Comparator.comparing(). Este método lida automaticamente com a lógica de comparação, tornando o código mais legível e conciso.
Basta passar uma referência de método que extrai o campo para comparação.
Comparator.comparing(Book::getTitle)
O método sort() da lista chama o Comparator passado, que, por sua vez, determina a ordem dos elementos ao compará-los com base nos valores retornados pelos métodos especificados.
Ordenação Múltipla
Para ordenar por múltiplos critérios, utilize o método thenComparing:
books.sort(
Comparator.comparing(Book::getYear) // First by year
.thenComparing(Book::getTitle) // Then by title
);
Este exemplo demonstra como ordenar uma lista de livros primeiro pelo year de lançamento e depois pelo title. O processo de ordenação compara inicialmente os livros pelo year e, caso dois livros possuam o mesmo year, compara-os pelo title para definir a ordem final.
Ordenação Reversa
Reverter a ordem de ordenação em Java é útil quando é necessário ordenar elementos por um critério e, em seguida, alterar a ordem para o próximo critério.
Os métodos reversed() e Comparator.reverseOrder() auxiliam no controle da direção da ordenação, mas funcionam de maneiras diferentes.
books.sort(
Comparator.comparing(Book::getYear).reversed() // Sort by year (descending)
.thenComparing(Book::getTitle, Comparator.reverseOrder()) // Then by title (descending)
);
Os livros são primeiro ordenados pelo seu ano de lançamento em ordem decrescente usando reversed(). Se vários livros compartilham o mesmo year, thenComparing() os ordena pelo title em ordem alfabética reversa utilizando Comparator.reverseOrder().
Isso garante que os livros mais recentes apareçam primeiro e, dentro do mesmo ano, os títulos sejam organizados de Z a A.
Diferenças entre Comparable e Comparator
Utilize a interface Comparable quando uma classe possui uma ordenação natural, como a ordenação por um único campo. Utilize Comparator ao ordenar por múltiplos critérios ou quando for necessário definir uma ordem personalizada para os objetos.
1. Quando utilizar a interface Comparable?
2. Quando utilizar a interface Comparator?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 2.33
Comparador: Comparação Personalizada de Dados
Deslize para mostrar o menu
Vamos analisar a segunda interface funcional, Comparator, observar como ela implementa a comparação e compreender a diferença entre Comparator e Comparable.
O que é Comparator?
O método principal na interface funcional Comparator é:
int compare(T o1, T o2);
O método compare(T o1, T o2) retorna:
- Um número negativo se
o1for menor queo2; - Zero se
o1eo2forem iguais; - Um número positivo se
o1for maior queo2.
Aplicação Prática
Implementação da ordenação de objetos Book utilizando a Comparator interface. Em vez de implementar o método de comparação diretamente na classe Book, utilize métodos estáticos do Comparator interface para definir a lógica de ordenação.
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 + ")"; } }
Neste exemplo, utiliza-se a interface Comparator para ordenar a lista books. Mas por que foi utilizado o método comparing() em vez de compare()?
Para utilizar o método compare(), é necessário criar um Comparator e implementar o método compare.
public static Comparator<Book> titleComparator = new Comparator<Book>() {
@Override
public int compare(Book b1, Book b2) {
return b1.getTitle().compareTo(b2.getTitle());
}
};
Este código define um Comparator<Book> utilizando uma classe anônima para comparar dois objetos Book pelo seu title.
Como String implementa Comparable, o método compareTo() é utilizado para comparar os títulos lexicograficamente, retornando um valor negativo, zero ou positivo.
Alternativamente, é possível obter o mesmo resultado com uma expressão lambda para uma implementação mais concisa:
(b1, b2) -> b1.getTitle().compareTo(b2.getTitle());
Mas existe uma abordagem ainda mais simples: utilizar o método Comparator.comparing(). Este método lida automaticamente com a lógica de comparação, tornando o código mais legível e conciso.
Basta passar uma referência de método que extrai o campo para comparação.
Comparator.comparing(Book::getTitle)
O método sort() da lista chama o Comparator passado, que, por sua vez, determina a ordem dos elementos ao compará-los com base nos valores retornados pelos métodos especificados.
Ordenação Múltipla
Para ordenar por múltiplos critérios, utilize o método thenComparing:
books.sort(
Comparator.comparing(Book::getYear) // First by year
.thenComparing(Book::getTitle) // Then by title
);
Este exemplo demonstra como ordenar uma lista de livros primeiro pelo year de lançamento e depois pelo title. O processo de ordenação compara inicialmente os livros pelo year e, caso dois livros possuam o mesmo year, compara-os pelo title para definir a ordem final.
Ordenação Reversa
Reverter a ordem de ordenação em Java é útil quando é necessário ordenar elementos por um critério e, em seguida, alterar a ordem para o próximo critério.
Os métodos reversed() e Comparator.reverseOrder() auxiliam no controle da direção da ordenação, mas funcionam de maneiras diferentes.
books.sort(
Comparator.comparing(Book::getYear).reversed() // Sort by year (descending)
.thenComparing(Book::getTitle, Comparator.reverseOrder()) // Then by title (descending)
);
Os livros são primeiro ordenados pelo seu ano de lançamento em ordem decrescente usando reversed(). Se vários livros compartilham o mesmo year, thenComparing() os ordena pelo title em ordem alfabética reversa utilizando Comparator.reverseOrder().
Isso garante que os livros mais recentes apareçam primeiro e, dentro do mesmo ano, os títulos sejam organizados de Z a A.
Diferenças entre Comparable e Comparator
Utilize a interface Comparable quando uma classe possui uma ordenação natural, como a ordenação por um único campo. Utilize Comparator ao ordenar por múltiplos critérios ou quando for necessário definir uma ordem personalizada para os objetos.
1. Quando utilizar a interface Comparable?
2. Quando utilizar a interface Comparator?
Obrigado pelo seu feedback!