1
resposta

[Dúvida] Outra solução?

No exercício 1 é solicitado: Crie uma classe Carro com métodos para representar um modelo específico ao longo de três anos. Implemente métodos para definir o nome do modelo, os preços médios para cada ano, e calcular e exibir o menor e o maior preço. Adicione uma subclasse ModeloCarro para criar instâncias específicas, utilizando-a na classe principal para definir preços e mostrar informações.

E a solução da Alura foi:

public class Carro { private String modelo; private double precoAno1; private double precoAno2; private double precoAno3;

public void definirModelo(String modelo) {
    this.modelo = modelo;
}

public void definirPrecos(double precoAno1, double precoAno2, double precoAno3) {
    this.precoAno1 = precoAno1;
    this.precoAno2 = precoAno2;
    this.precoAno3 = precoAno3;
}

public void exibirInfo() {
    System.out.println("Modelo: " + modelo);
    System.out.println("Preço Ano 1: " + precoAno1);
    System.out.println("Preço Ano 2: " + precoAno2);
    System.out.println("Preço Ano 3: " + precoAno3);
    System.out.println("Menor Preço: " + calcularMenorPreco());
    System.out.println("Maior Preço: " + calcularMaiorPreco());
}

private double calcularMenorPreco() {
    double menorPreco = precoAno1;

    if (precoAno2 < menorPreco) {
        menorPreco = precoAno2;
    }

    if (precoAno3 < menorPreco) {
        menorPreco = precoAno3;
    }

    return menorPreco;
}

private double calcularMaiorPreco() {
    double maiorPreco = precoAno1;

    if (precoAno2 > maiorPreco) {
        maiorPreco = precoAno2;
    }

    if (precoAno3 > maiorPreco) {
        maiorPreco = precoAno3;
    }

    return maiorPreco;
}

}

public class ModeloCarro extends Carro {

public class TesteCarro { public static void main(String[] args) { ModeloCarro meuCarro = new ModeloCarro(); meuCarro.definirModelo("Sedan"); meuCarro.definirPrecos(30000, 32000, 35000); meuCarro.exibirInfo(); } }

Mas... Gostaria de ter uma solução diferente para não criar 3 variáveis "precoAno", mas sim apenas 1 que pudesse inserir vários valores, e a função fizesse o "serviço" de analisar quais deles seria o menor e maior preço. Sei que isso é possível, só não sei como rsrs... Podem me ajudar?

1 resposta

Olá.

Bom acredito que para implementar esse exercicio com as funções que você deseja, terá que utilizar alguma Classe ou interface do Java que ainda não foi apresentada no curso. Eu consegui implementar utilizando a interface Map, com a Classe HashMap. Vou deixar o código modificado aqui e também a documentação dessas classes para você poder consultar.

Documentação Map: https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/util/Map.html

Documentação HashMap: https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/util/HashMap.html

Documentação Map.Entry: https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/util/Map.Entry.html

Deixei comentado partes da solução da alura para que possa comparar com a forma que eu implementei. Código da Classe Carro alterado:

package CarroExercicio;

import java.util.HashMap;
import java.util.Map;

public class Carro {
    private String modelo;
//    private double precoAno1;
//    private double precoAno2;
//    private double precoAno3;

    // Aqui eu criei um atributo precoPorAno que possui o tipo Map (Uma interface muito util que permite vincular valores a uma chave).
    // No caso foi vinculado um valor Double a uma chave Integer. O double vai ser o preço vinculado a um ano.
    // Depois inicializamos o campo para um novo HashMap, que é uma classe que implementa a interface Map. Assim como List e ArrayList.
    private Map<Integer, Double> precoPorAno = new HashMap<>();

    public void definirModelo(String modelo) {
        this.modelo = modelo;
    }

//    public void definirPrecos(double precoAno1, double precoAno2, double precoAno3) {
//        this.precoAno1 = precoAno1;
//        this.precoAno2 = precoAno2;
//        this.precoAno3 = precoAno3;
//    }

    //A funcao dfinirPrecos nao sera mais utilizada, para definir os precos criei uma outra funcao que adiciona valores no Map, utilizando o metodo put.
    public void adicionarPreco(int ano, double preco) {
        precoPorAno.put(ano, preco);
    }
    //Para exibir as informacoes vamos fazer um loop forEach nos valores do mapa utilizando a funcao entrySet() da interface Map, que retorna todos os valores do mapa como um Map.Entry
    public void exibirInfo() {
        System.out.println("Modelo: " + modelo);
//        System.out.println("Preço Ano 1: " + precoAno1);
//        System.out.println("Preço Ano 2: " + precoAno2);
//        System.out.println("Preço Ano 3: " + precoAno3);
        for (Map.Entry<Integer, Double> entrada : precoPorAno.entrySet()) {
            System.out.println("Ano: " + entrada.getKey() + ", Preço: " + entrada.getValue());
        }
        System.out.println("Menor Preço: " + calcularMenorPreco());
        System.out.println("Maior Preço: " + calcularMaiorPreco());
    }

    //Para calcular o menor preco, iremos fazer um loop nos valores do Map
    private double calcularMenorPreco() {
//        double menorPreco = precoAno1;
//
//        if (precoAno2 < menorPreco) {
//            menorPreco = precoAno2;
//        }
//
//        if (precoAno3 < menorPreco) {
//            menorPreco = precoAno3;
//        }

        //primeiro criamos uma variavel menorPreco com o maior valor de Double, assim ela sera associada ao preco do ano 1 quando o loop comecar.
        Double menorPreco = Double.MAX_VALUE;
        for (Double preco : precoPorAno.values()) {
            if (preco < menorPreco) {
                menorPreco = preco;
            }
        }
        return menorPreco;
    }

    //De forma similar ao menor preco, faremos um loop parecido com o maior preco
    private double calcularMaiorPreco() {
//        double maiorPreco = precoAno1;
//
//        if (precoAno2 > maiorPreco) {
//            maiorPreco = precoAno2;
//        }
//
//        if (precoAno3 > maiorPreco) {
//            maiorPreco = precoAno3;
//        }

        Double maiorPreco = Double.MIN_VALUE;
        for (Double preco : precoPorAno.values()) {
            if (preco > maiorPreco) {
                maiorPreco = preco;
            }
        }

        return maiorPreco;
    }
}

Código da Classe TesteCarro alterado:

package CarroExercicio;

public class TesteCarro {
    public static void main(String[] args) {
        ModeloCarro meuCarro = new ModeloCarro();
        meuCarro.definirModelo("Sedan");
        //Na funcao principal vamos alterar o codigo para receber os precos no Map
        //adicionamos utilizando o metodo meuCarro.adicionarPreco( no primeiro argumento colocamos o inteiro para o ano, no segundo o double do valor)
        meuCarro.adicionarPreco(2001, 1000.00);
        meuCarro.adicionarPreco(2002, 1200.00);
        meuCarro.adicionarPreco(2003, 1300.00);
        meuCarro.exibirInfo();
    }
}