Como fazer um comparador no java

Este post discutirá como classificar uma lista de objetos usando Comparator em Java.

UMA Comparador é uma função de comparação, que fornece uma ordenação para coleções de objetos que não possuem uma ordenação natural. O implementador desta classe precisa substituir o método abstrato compare() definido em java.util.Comparator, que compara seus dois argumentos para ordem. O valor devolvido pelo compare() O método decide a posição do primeiro objeto em relação ao segundo objeto.

  • Se compare() retorna um inteiro negativo, o primeiro argumento é menor que o segundo.
  • Se compare() retorna um zero, o primeiro argumento é igual ao segundo.
  • Se compare() retorna um inteiro positivo, o primeiro argumento é maior que o segundo.

 
Existem várias maneiras de implementar Comparadores em Java:

1. Passe Comparador como argumento para sort() método

Comparadores, se passados para um método de classificação (como Collections.sort (e Arrays.sort), permitem um controle preciso sobre a ordem de classificação. No exemplo a seguir, obtemos um Comparator que compara Person objetos por sua idade.

    public Person(String name, int age)

    public String getName() {

    public static void main(String[] args)

        List<Person> persons = new ArrayList<>(Arrays.asList(

        Collections.sort(persons, new Comparator<Person>() {

            public int compare(Person p1, Person p2) {

        System.out.println(persons);

Download  Executar código

Resultado:
[{name='Joe', age=10}, {name='John', age=15}, {name='Will', age=20}, {name='Dan', age=20}, { name='Sam', idade=25}]

 
Desde Comparator é uma interface funcional, ela pode ser usada como destino de atribuição para uma expressão lambda ou referência de método. Portanto,

Collections.sort(persons, new Comparator<Person>() {

    public int compare(Person p1, Person p2) {

        return p1.getAge() - p2.getAge();

pode ser reescrita como:

Collections.sort(persons, (p1, p2) -> p1.getAge() - p2.getAge());

 
O Java 8 introduziu vários aprimoramentos no Comparator interface. Agora Comparator tem métodos estáticos como comparing(), que pode facilmente criar Comparadores para comparar alguns valores específicos de objetos. Por exemplo, para obter um Comparator que compara Person objetos por sua idade, podemos fazer:

Comparator<Person> byAge = Comparator.comparing(Person::getAge);

Collections.sort(persons, byAge);

 
O código acima ordenará a lista da pessoa apenas pelo age campo. Se duas pessoas têm a mesma idade, sua ordem relativa na lista ordenada não é fixa. Portanto, é preferível comparar objetos usando vários campos para evitar esses casos.

Como comparar objetos com os vários campos?

1. Podemos classificar facilmente a lista da pessoa primeiro por age e depois por name, como mostrado abaixo. Já para pessoas da mesma idade, a ordenação é decidida pelo nome da pessoa.

Collections.sort(persons, new Comparator<Person>() {

    public int compare(Person p1, Person p2)

        if (p1.getAge() != p2.getAge()) {

            return p1.getAge() - p2.getAge();

        return p1.getName().compareTo(p2.getName());

Download  Executar código

 
Observe que simplesmente reduzimos o valor de int tipo primitivo age um do outro enquanto para o objeto String, o método de comparação embutido compareTo() é usado. Normalmente, essa cadeia pode continuar a incluir outras propriedades também.

 
2. Também podemos fazer isso com expressões lambda usando o .thenComparing() método, que efetivamente combina duas comparações em uma:

Comparator<Person> byAge = Comparator.comparing(Person::getAge);

Comparator<Person> byName = Comparator.comparing(Person::getName);

Collections.sort(persons, byAge.thenComparing(byName));

Download  Executar código

 
3. Também podemos usar goiaba ComparisonChain para executar uma instrução de comparação encadeada, conforme mostrado abaixo:

Collections.sort(persons, new Comparator<Person>() {

    public int compare(Person p1, Person p2)

        return ComparisonChain.start()

                        .compare(p1.getAge(), p2.getAge())

                        .compare(p1.getName(), p2.getName())

Código de download

 
O valor de retorno do compare() terá o mesmo sinal que o primeiro resultado de comparação diferente de zero na cadeia ou será zero se cada resultado de comparação for zero. Observe que o ComparisonChain para de chamar suas entradas compareTo e compare métodos assim que um deles retornar um resultado diferente de zero.

 
4. Também podemos usar o CompareToBuilder classe da biblioteca Apache Commons Lang para auxiliar na implementação do Comparator.compare() método. Para usar essa classe, escreva o código da seguinte forma:

Collections.sort(persons, new Comparator<Person>() {

    public int compare(Person p1, Person p2)

        return new CompareToBuilder()

                        .append(p1.getAge(), p2.getAge())

                        .append(p1.getName(), p2.getName())

Código de download

 
Os valores são comparados na ordem em que são anexados ao construtor. Se qualquer comparação retornar um resultado diferente de zero, esse valor será retornado por toComparison(), e todas as comparações subsequentes são ignoradas.

2. Implemente o Comparator em uma classe separada

Podemos até implementar Comparator em uma classe separada e, em seguida, passar a instância dessa classe para o sort() método. Isso é demonstrado abaixo:

    public Person(String name, int age)

    public String getName() {

class MyComparator implements Comparator<Person>

    public int compare(Person p1, Person p2)

        if (p1.getAge() != p2.getAge()) {

        return p1.getName().compareTo(p2.getName());

    public static void main(String[] args)

        List<Person> persons = new ArrayList<>(Arrays.asList(

        Collections.sort(persons, new MyComparator());

        System.out.println(persons);

Download  Executar código

Resultado:
[{name='Joe', age=10}, {name='John', age=15}, {name='Dan', age=20}, {name='Will', age=20}, { name='Sam', idade=25}]

3. Passe o Comparador para List.sort() método

O Java 8 introduziu vários aprimoramentos no List interface. Agora List tem seu próprio método de classificação sort() que classifica a lista de acordo com a ordem induzida pelo especificado Comparator. Isso é demonstrado abaixo:

    public Person(String name, int age)

    public String getName() {

    public static void main(String[] args)

        List<Person> persons = new ArrayList<>(Arrays.asList(

        persons.sort(Comparator.comparing(Person::getAge)

                                .thenComparing(Comparator.comparing(Person::getName)));

        System.out.println(persons);

Download  Executar código

Resultado:
[{name='Joe', age=10}, {name='John', age=15}, {name='Dan', age=20}, {name='Will', age=20}, { name='Sam', idade=25}]

4. Passe o Comparador para Stream.sorted() método

Também podemos passar nosso comparador para o sorted() método do Stream class, que retorna um fluxo que consiste nos elementos desse fluxo, classificados de acordo com o Comparator. Aqui está um exemplo de trabalho:

import java.util.ArrayList;

import java.util.Comparator;

import java.util.stream.Collectors;

    public Person(String name, int age)

    public String getName() {

    public static void main(String[] args)

        List<Person> persons = new ArrayList<>(Arrays.asList(

        persons = persons.stream()

                        .sorted(Comparator.comparing(Person::getAge)

                                        .thenComparing(Comparator.comparing(Person::getName)))

                        .collect(Collectors.toList());

        System.out.println(persons);

Download  Executar código

Resultado:
[{name='Joe', age=10}, {name='John', age=15}, {name='Dan', age=20}, {name='Will', age=20}, { name='Sam', idade=25}]

Isso é tudo sobre como classificar uma lista de objetos usando Comparator em Java.

 
Continue lendo:

Classifique uma lista de objetos usando Comparable em Java

Última postagem

Tag