Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

dois ou mais métodos compareTo()

Implementei uma solução para o desafio proposto. No desafio, após ter feito as compras o sistema imprime todos os produtos do carrinho, ordenados pelo preço.

Minha classe "Produto" possui os atributos: nome, preço, marca e modelo.

Gostaria de adicionar uma nova funcionalidade neste desafio, para que, após ter feito as compras, o sistema pergunte ao usuário por qual atributo a listagem será ordenada, por nome, preço, marca ou modelo?

Tentei implementar essa funcionalidade e surgiu uma dúvida: utilizando a interface "Comparable" eu poderia ter duas ou mais implementações do método compareTo() ? (uma para cada atributo)

É possível ter um método compareTo() para ser utilizado para ordenar pelo nome, outro para o preço, outro para marca e outro para modelo?

Obrigado.

1 resposta
solução!

Olá, Benedito. Tudo bem?

Sobre a sua dúvida, a interface Comparable permite que você implemente o método compareTo(), mas apenas uma vez por classe. Isso significa que você não pode ter múltiplas implementações de compareTo() diretamente na mesma classe para diferentes atributos.

Porém, você pode resolver isso usando a interface Comparator, que é mais flexível para esse tipo de situação. Você pode criar diferentes classes que implementem Comparator para cada atributo que você deseja ordenar. Aqui está um exemplo de como você pode fazer isso:

import java.util.Comparator;

public class Produto {
    private String nome;
    private double preco;
    private String marca;
    private String modelo;

    // Construtores, getters e setters

    // Comparador por nome
    public static class ComparadorPorNome implements Comparator<Produto> {
        @Override
        public int compare(Produto p1, Produto p2) {
            return p1.getNome().compareTo(p2.getNome());
        }
    }

    // Comparador por preço
    public static class ComparadorPorPreco implements Comparator<Produto> {
        @Override
        public int compare(Produto p1, Produto p2) {
            return Double.compare(p1.getPreco(), p2.getPreco());
        }
    }

    // Comparador por marca
    public static class ComparadorPorMarca implements Comparator<Produto> {
        @Override
        public int compare(Produto p1, Produto p2) {
            return p1.getMarca().compareTo(p2.getMarca());
        }
    }

    // Comparador por modelo
    public static class ComparadorPorModelo implements Comparator<Produto> {
        @Override
        public int compare(Produto p1, Produto p2) {
            return p1.getModelo().compareTo(p2.getModelo());
        }
    }
}

Com essa abordagem, você pode perguntar ao usuário por qual atributo ele deseja ordenar e, em seguida, usar o Collections.sort() com o comparador apropriado. Por exemplo:

Collections.sort(listaDeProdutos, new Produto.ComparadorPorNome());

Dessa forma, você pode ter múltiplas maneiras de ordenar sua lista, dependendo da escolha do usuário.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!