Comparable: Ordenação Natural dos Dados
Em Java, é comum precisar ordenar objetos. Por exemplo, em uma lista de livros, pode ser necessário ordená-los por título, autor ou ano de publicação.
Para lidar com essas tarefas, Java fornece as interfaces Comparable e Comparator. Ambas alcançam o mesmo objetivo (ordenar objetos), mas fazem isso de maneiras diferentes. Vamos analisá-las separadamente.
O que é Comparable?
Por exemplo, strings em Java são ordenadas alfabeticamente por padrão porque a classe String implementa Comparable.
O método principal na interface funcional Comparable é:
int compareTo(T o);
Este método retorna:
- Um número negativo se o objeto atual for menor que o objeto fornecido;
- Zero se os objetos forem iguais;
- Um número positivo se o objeto atual for maior que o objeto fornecido.
Exemplo: Ordenação de Livros por Ano
Suponha que seja necessário comparar objetos Book com base em seu ano de publicação.
Para isso, a classe Book pode implementar Comparable e sobrescrever o método compareTo. Ao sobrescrever esse método, define-se como os objetos Book devem ser comparados, o que afeta diretamente o comportamento de ordenação em métodos como Collections.sort().
Isso permite controlar a ordem em que os livros são organizados—seja crescente ou decrescente—de acordo com a lógica implementada em compareTo.
Main.java
1234567891011121314151617181920212223242526272829303132333435363738394041424344package com.example; import java.util.List; import java.util.ArrayList; import java.util.Collections; public class Main { public static void main(String[] args) { List<Book> books = new ArrayList<>(); books.add(new Book("Book A", "Author X", 2020)); books.add(new Book("Book B", "Author Y", 2018)); books.add(new Book("Book C", "Author Z", 2021)); Collections.sort(books); // Uses `compareTo` System.out.println(books); } } class Book implements Comparable<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 int getYear() { return year; } @Override public int compareTo(Book other) { return Integer.compare(this.year, other.year); // Compare by publication year } @Override public String toString() { return title + " (" + year + ")"; } }
Quando Collections.sort(books) é chamado, o Java itera sobre a lista, comparando os elementos utilizando o método compareTo definido na classe Book.
Para cada comparação, compareTo retorna um valor numérico que determina a ordem de dois livros. Com base nesses valores, o algoritmo de ordenação reorganiza os elementos para que fiquem ordenados por ano de publicação crescente.
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
Comparable: Ordenação Natural dos Dados
Deslize para mostrar o menu
Em Java, é comum precisar ordenar objetos. Por exemplo, em uma lista de livros, pode ser necessário ordená-los por título, autor ou ano de publicação.
Para lidar com essas tarefas, Java fornece as interfaces Comparable e Comparator. Ambas alcançam o mesmo objetivo (ordenar objetos), mas fazem isso de maneiras diferentes. Vamos analisá-las separadamente.
O que é Comparable?
Por exemplo, strings em Java são ordenadas alfabeticamente por padrão porque a classe String implementa Comparable.
O método principal na interface funcional Comparable é:
int compareTo(T o);
Este método retorna:
- Um número negativo se o objeto atual for menor que o objeto fornecido;
- Zero se os objetos forem iguais;
- Um número positivo se o objeto atual for maior que o objeto fornecido.
Exemplo: Ordenação de Livros por Ano
Suponha que seja necessário comparar objetos Book com base em seu ano de publicação.
Para isso, a classe Book pode implementar Comparable e sobrescrever o método compareTo. Ao sobrescrever esse método, define-se como os objetos Book devem ser comparados, o que afeta diretamente o comportamento de ordenação em métodos como Collections.sort().
Isso permite controlar a ordem em que os livros são organizados—seja crescente ou decrescente—de acordo com a lógica implementada em compareTo.
Main.java
1234567891011121314151617181920212223242526272829303132333435363738394041424344package com.example; import java.util.List; import java.util.ArrayList; import java.util.Collections; public class Main { public static void main(String[] args) { List<Book> books = new ArrayList<>(); books.add(new Book("Book A", "Author X", 2020)); books.add(new Book("Book B", "Author Y", 2018)); books.add(new Book("Book C", "Author Z", 2021)); Collections.sort(books); // Uses `compareTo` System.out.println(books); } } class Book implements Comparable<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 int getYear() { return year; } @Override public int compareTo(Book other) { return Integer.compare(this.year, other.year); // Compare by publication year } @Override public String toString() { return title + " (" + year + ")"; } }
Quando Collections.sort(books) é chamado, o Java itera sobre a lista, comparando os elementos utilizando o método compareTo definido na classe Book.
Para cada comparação, compareTo retorna um valor numérico que determina a ordem de dois livros. Com base nesses valores, o algoritmo de ordenação reorganiza os elementos para que fiquem ordenados por ano de publicação crescente.
Obrigado pelo seu feedback!