Pelo que entendi segue explicação:
Comparable altera classe que será posto,
int = "Compara esse objeto com o objeto especificado para a ordem"
Comparator Devera ser colocado fora da classe como nova classe.
int = "Compara seus dois argumentos para ordem",
boolean = "Indica se algum outro Objeto é "igual a" este comparador"
Referencias
Comparable X Comparator
Comparable
Comparable
fornece uma única sequência de ordenação. Em outras palavras, podemos ordenar a coleção com base em um único elemento, como id, nome e preço.Comparable
afeta a classe original, ou seja, a classe atual é modificada.Comparable
fornece o método compareTo()
para ordenar elementos.Comparable
está presente no pacote java.lang
.- Podemos ordenar os elementos da lista do tipo
Comparable
usando o método Collections.sort(List)
.
Comparator
- O
Comparator
fornece o método compare()
para ordenar elementos. - O
Comparator
fornece múltiplas sequências de ordenação. Em outras palavras, podemos ordenar a coleção com base em múltiplos elementos, como id, nome, preço, etc. - O
Comparator
não afeta a classe original, ou seja, a classe atual não é modificada. - Um
Comparator
está presente no pacote java.util
. - Podemos ordenar os elementos da lista do tipo
Comparator
usando o método Collections.sort(List, Comparator)
.
Collections
- A classe
Collections
é uma classe utilitária do Java para operações comuns em coleções. - Ela fornece métodos para ordenação, busca, manipulação e sincronização de coleções.
- O método
sort()
é usado para ordenar uma lista em ordem ascendente. - O método
sort()
em conjunto com Collections.reverseOrder()
permite ordenar em ordem descendente.
package main.java.comparableXcomparator;
import java.util.Comparator;
// Uma classe 'Livro' que implementa Comparable
class Livro implements Comparable<Livro> {
private String titulo;
private String autor;
private int ano;
// Construtor
public Livro(String ti, String au, int an) {
this.titulo = ti;
this.autor = au;
this.ano = an;
}
// Usado para ordenar livros por ano
public int compareTo(Livro l) {
return titulo.compareTo(l.titulo);
}
// Métodos getters para acessar os dados privados
public String getTitulo() {
return titulo;
}
public String getAutor() {
return autor;
}
public int getAno() {
return ano;
}
}
// Classe para comparar Livro por autor
class CompararAutor implements Comparator<Livro> {
public int compare(Livro l1, Livro l2) {
return l1.getAutor().compareTo(l2.getAutor());
}
}
// Classe para comparar Livro por ano
class CompararAno implements Comparator<Livro> {
public int compare(Livro l1, Livro l2) {
if (l1.getAno() < l2.getAno())
return -1;
if (l1.getAno() > l2.getAno())
return 1;
else
return 0;
}
}
class CompararAnoAutorTitulo implements Comparator<Livro> {
@Override
public int compare(Livro l1, Livro l2) {
int ano = Integer.compare(l1.getAno(), l2.getAno());
if (ano != 0)
return ano;
int autor = l1.getAutor().compareTo(l2.getAutor());
if (autor != 0)
return autor;
return l1.getTitulo().compareTo(l2.getTitulo());
}
}