3
respostas

Dúvida em relação à comparação da Lista

Boa noite, tudo bem? Infelizmente estou tendo dificuldades em utilizar o compareTo no meu código junto da implementação da interface Comparable. Não entendi muito bem como fazer o Override para que a comparação seja executada... poderiam me ajudar com isso e até mesmo o que pode ser melhorado no meu código?

Classe principal:

import java.util.Scanner;

public class App {
    public static void main(String[] args){
        int option = -1;
        Scanner scanner = new Scanner(System.in);

        System.out.println("Digite o limite do seu cartão: ");
        Credit creditCard = new Credit(scanner.nextFloat());
        
        while (option != 0) {
            System.out.println("Digite a descrição do produto: ");
            String description = scanner.next();
            System.out.println("Digite o valor da compra: ");
            float price = scanner.nextFloat();

            Product product = new Product(description, price);
            boolean bought = creditCard.buyProduct(product);
            if (bought) {
                System.out.println("Compra realizada!");
                System.out.println("Saldo atual: " + creditCard.getBalance());

                System.out.println("Digite 0 para sair e 1 para continuar"); 
                option = scanner.nextInt();
                switch (option) {
                    case 0:
                        option = 0;
                        break;
                    case 1:
                        break;
                    default:
                        System.out.println("Opção inválida.");
                        option = 0;
                        break;
                }

            } else {
                option = 0;
                System.out.println("Saldo insuficiente.");
            }
        }

        creditCard.menu();
        scanner.close();
    }
}

Classe do cartão:


import java.util.ArrayList;
import java.util.List;

public class Credit {
    private float limit;
    private float balance;
    private List<Product> purchases;

    public Credit(float limit) {
        this.limit = limit;
        balance = this.limit;
        this.purchases = new ArrayList<>();
    }

    public float getLimit() {
        return limit;
    }

    public void setLimit(float credit) {
        this.limit = credit;
    }

    public float getBalance() {
        return balance;
    }    

    public List<Product> getPurchases() {
        return purchases;
    }

    public boolean buyProduct(Product product) {
        if (product.getPrice() <= this.balance) {
            this.purchases.add(product);
            this.balance -= product.getPrice();
            return true;
        } else {
            return false;
        }
    }

    public void menu(){
        System.out.println("Produtos comprados: " + this.getPurchases());
        System.out.println("Saldo restante: " + this.getBalance());
    }
}

Classe do produto:

public class Product implements Comparable<Product>{
    private String description;
    private float price;

    public Product(String description, float price) {
        this.description = description;
        this.price = price;
    }
    
    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return this.description + ": " + this.price;
    }

    @Override
    public int compareTo(Product otherProduct) {
         if (this.price < otherProduct.price) {
             return -1;
         }
         if (this.price > otherProduct.price) {
             return 1;
         }
         else {
             return 0;
         }
    }
}
3 respostas

Boa noite Diogo, tudo bem?

Para ordenar, faltou apenas chamar o método de ordenação "Collections.sort()", para isso poderia deixar o seu método menu() da seguinte forma

    public void menu(){
        Collections.sort(this.getPurchases());
        System.out.println("Produtos comprados: " + this.getPurchases());
        System.out.println("Saldo restante: " + this.getBalance());
    }

Porém o seu método compareTo() está ordenando a lista de forma crescente.

Espero ter ajudado. Atte.:

Muito obrigado! Mas ainda tenho uma dúvida... pq usar o 'Collections.sort'? Não preciso fazer uma chamada de 'compareTo' para poder ordenar a lista? Ao implementar o override do 'compareTo' eu mudo a funcionalidade do 'Collections.sort'?

O método Collections.sort é usado para ordenar uma lista de objetos que implementam a interface Comparable. A interface Comparable contém o método compareTo, que é usado para definir a lógica de comparação entre os objetos da classe. Quando você usa Collections.sort, ele se baseia no método compareTo para determinar a ordem dos elementos na lista.

Imagine que você tem uma coleção de livros, cada um com um título e um autor. Agora, você deseja organizar esses livros em ordem alfabética pelo título.

O método Collections.sort é como um assistente que você chama para ajudá-lo a organizar seus livros. No entanto, para que esse assistente saiba como classificar os livros, você precisa lhe dar uma maneira de compará-los.

Aqui, a interface Comparable é como uma regra que você cria para dizer ao assistente como comparar os livros. Ela possui uma "ferramenta" chamada compareTo, que é como um dicionário que ajuda o assistente a saber qual livro vem primeiro em ordem alfabética.

Então, você implementa essa regra (a interface Comparable) em cada livro. Você ensina ao assistente que, para comparar os livros, ele deve usar o título do livro e seguir a ordem do alfabeto.

Agora, quando você chama o assistente (o Collections.sort) e diz a ele para organizar seus livros, ele olha para a regra (a interface Comparable) que você ensinou a ele (através do compareTo) e usa essa regra para organizar os livros em ordem alfabética. Assim, você obtém sua coleção de livros organizada pelo título, do A ao Z.

Resumindo, o Collections.sort é como um organizador de livros que você instrui a usar uma regra (a interface Comparable e o compareTo) para classificar os livros em ordem alfabética pelo título.