cami-la / curso-dio-intro-collections

Resolução dos exercícios propostos: CURSO INTRODUTÓRIO COLLECTIONS FRAMEWORK JAVA.
https://web.digitalinnovation.one/home
602 stars 210 forks source link

Map - Exercício Proposto 2 #8

Open natan20200679 opened 2 years ago

natan20200679 commented 2 years ago

Camila, boa tarde! Eu não consegui assimilar este exercício, mesmo refazendo baseado na sua solução. Tu poderias me explicar tua lógica, mostrando ao menos outra opção no uso de métodos e funções, principalmente a partir do uso do Map em diante?

cami-la commented 2 years ago

Oi, boa tarde! Veja se agora ficou melhor:

import java.util.*;

public class Main {
  public static void main(String[] args) {
    List<Integer> resultadoDosLancamentos = lancamentoDeDados();
    //System.out.println(resultadoDosLancamentos);

    Map<Integer, Integer> lancamentosOrganizadosPorGrupo = lancamentosOrganizados(lancamentoDeDados());
    //System.out.println(lancamentosOrganizadosPorGrupo);

    simulacaoDeProcessamento();

    exibindoResultadoDosLancamentosAgrupados(lancamentosOrganizadosPorGrupo);

  }

  //Método que irá gerar os números aleatórios simulando o lançamento de um dado 100 vezes.
  private static List<Integer> lancamentoDeDados(){

    //Classe Java que gera números aleartórios
    Random lancadorDeDados = new Random();

    //Lista que irá armazenar todos os valores gerados
    List<Integer> todosResuldadoDosLancamentos = new ArrayList<>();
    for(int i = 0; i < 100; i++) {
      //Esse valor deverá ser entre 1 e 6.
      int resuldadoDoLancamento = lancadorDeDados.nextInt(6) + 1;
      //Adicionando o resuldadoDoLancamento dentro da lista de lançamentos
      todosResuldadoDosLancamentos.add(resuldadoDoLancamento);
    }

    return todosResuldadoDosLancamentos;
  }

  //Método que irá organizar os resultados dos lançamenots em grupos de 1 a 6 (resultados possíveis de um dado)
  private static Map<Integer, Integer> lancamentosOrganizados(List<Integer> lancamentosDeDados){
    //Map que irá armazenar os resultados dos lançamentos de acordo com o resultado.
    Map<Integer, Integer> resultadoDosLancamentosOrganizados = new HashMap<Integer, Integer>();

    //Vamos pegar a lista com todos os lançamentos e organizar dentro de um map chave e valor.
    for (Integer resultadoDoLancamento : lancamentosDeDados) {
      //Se ao navegar na lista, o elemento armazenado na lista (que é o resultado do lançamento) já tiver aparecido:
      if (resultadoDosLancamentosOrganizados.containsKey(resultadoDoLancamento)) {
        //Pega esse resultado e coloca dentro do Map como key e informa, acrescentando +1 no value para indicar que esse resultado apareceu mais uma vez.
        resultadoDosLancamentosOrganizados.put(resultadoDoLancamento, (resultadoDosLancamentosOrganizados.get(resultadoDoLancamento) + 1));
      } else { //Se foi a primeira vez que o resultado apareceu na lista
        //Pega esse resultado e coloca como key de um elemento do Map, e informa no valor que ele apareceu pela primeira vez, indicando 1.
        resultadoDosLancamentosOrganizados.put(resultadoDoLancamento, 1);
      }
    }

    return resultadoDosLancamentosOrganizados;
  }

  //Simulando como se o lançador demorasse um tempo para lançar e contabilizar.
  private static void simulacaoDeProcessamento() {
    System.out.print("Processando");
    for (int i = 0; i < 5; i++) {
      try {
        Thread.sleep(1000);
        System.out.print(".");
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }

  //Exibindo o resultado dos lançamentos agrupados.
  private static void exibindoResultadoDosLancamentosAgrupados(Map<Integer, Integer> resuldadoDosLancamentosAgrupados){
    System.out.println("\nValor " + " Quant. de vezes");
    for (Map.Entry<Integer, Integer> entry : resuldadoDosLancamentosAgrupados.entrySet()) {
      //Formatando a saída no console com espaçamento. 
      // Pegando Key (Valor da face do dado) e Value (quantas vezes deu o número dessa face nos lançamentos.)
      System.out.printf("%3d %10d\n", entry.getKey(), entry.getValue());
    }
  }

}
natan20200679 commented 2 years ago

OI Camila! Olha, as instruções das linhas 11 e 13 podem ser omitidas, já que são definidas nas linhas 56 e 69? A instrução da linha 5 não é pleonástica (desnecessária), já que a da linha 24 faz o mesmo? Tu podes me relembrar o porque da formatação numérica na última linha de instrução?

cami-la commented 2 years ago

Oi amigo, vamos lá. Não sei se entendi bem sua dúvida, mas creio que você está confundindo a declaração do método com a invocação do método.

Nas linhas 18, 36, 56 e 29 são as criações dos métodos. Nas linhas 5, 8, 11 e 13 são as invocação desses métodos. Tente comentar essas linhas e veja o que acontece.

Seguinte: O método main (linha 4) é o método que será a porta de entrada do nosso sistema. A máquina virtual JVM vai varrer esse método, executando tudo o que estiver dentro dele, de maneira sequencial. Assim, se apagar as linhas 5, 8, 11 e 13 a JVM náo irá saber que você quer executar os métodos criados nas linhas 18, 36, 56 e 29.

Sobre a formatação númerica, formatei para o resultado ficar mais legível no console. Porém é opcional.

Você copiou esse código que eu fiz e tentou rodar na sua máquina?

natan20200679 commented 2 years ago

Executei o código, e funciona perfeitamente. Porém, ainda não consegui visualizar nesta saída essa formatação que colocou no final, ou seja, entender o que realmente ela faz. Essa invocação de métodos podemos dizer que é uma chamada de rotina, conforme vemos em lógica de programação?

cami-la commented 2 years ago

Descomentando as linhas 6 e 9.

2022-01-26_11-30

Pode ser pensar em chamada de rotina. Mas em Orientação a Objetos usamos os métodos.

natan20200679 commented 2 years ago

Camila, perdoe-me querida, eu não expressei claramante a minha dúvida quando coloquei que não consegui visualizar na saída a formatação que colocou no final. Eu me referi apenas à formatação numérica que colocou na linha 74. Mesmo assim, levei em consideração sua explicação.

natan20200679 commented 2 years ago

Analisando agora, achei um pouco confuso a lógica presente entre as linhas 43 e 48, porque estou habituado a utilizar o "if" sempre no formato if (var != valor ou dado), por exemplo. Tou te alugando hoje kkk

cami-la commented 2 years ago

Camila, perdoe-me querida, eu não expressei claramante a minha dúvida quando coloquei que não consegui visualizar na saída a formatação que colocou no final. Eu me referi apenas à formatação numérica que colocou na linha 74. Mesmo assim, levei em consideração sua explicação.

Amigo, nem se preocupe. Estou aqui pra ajudar. Estou tentando deixar tudo o mais explicativo possível.

Aaaah, agora acho que entendi. No caso, você não entendeu o System.out.printf("%3d %10d\n", entry.getKey(), entry.getValue()) Vou te deixar um link que explica sobre formatação de Strings: http://www.bosontreinamentos.com.br/java/metodos-printf-print-e-println-curso-de-programacao-em-java/

Caso você queira se aprofundar, neste curso, eu explico com detalhes sobre isso: https://web.dio.me/course/entrada-e-saida-de-arquivos-io-em-java/learning/91871c29-e97e-4434-be0e-71aa71df80f3/?back=/browse

cami-la commented 2 years ago

Analisando agora, achei um pouco confuso a lógica presente entre as linhas 43 e 48, porque estou habituado a utilizar o "if" sempre no formato if (var != valor ou dado), por exemplo. Tou te alugando hoje kkk

Ah, vamos lá. Dentro do if é necessário ter true ou false. Então, você pode fazer verificações dentro desse if, como por exemplo o da linha 43. A linha 48 é o método .put()do Map, para adicionar ou atualizar chave e valor de um elemento do Map.

natan20200679 commented 2 years ago

Entendi querida! Obrigado pela atenção!

natan20200679 commented 2 years ago

Se possível, gostaria que verificasse erros nos comentários que acrescentei ao código https://github.com/natan20200679/Java/blob/master/Collections/src/Map/EP_2.java

cami-la commented 2 years ago

Se possível, gostaria que verificasse erros nos comentários que acrescentei ao código https://github.com/natan20200679/Java/blob/master/Collections/src/Map/EP_2.java

Sim está ótimo!!

Só na linha 18: // Criação da lista (dicionário) de par de valores contendo a frequência de cada número do dado, através da List é uma lista e Map é um dicionário. Então não pode misturar os conceitos. (:

natan20200679 commented 2 years ago

Se possível, gostaria que verificasse erros nos comentários que acrescentei ao código https://github.com/natan20200679/Java/blob/master/Collections/src/Map/EP_2.java

Sim está ótimo!!

Só na linha 18: // Criação da lista (dicionário) de par de valores contendo a frequência de cada número do dado, através da List é uma lista e Map é um dicionário. Então não pode misturar os conceitos. (:

Obg querida!

Guardianofligth commented 2 years ago

Boa noite Camila! Acabei de assistir a sua mentoria na DIO.

Então, sobre o exercício proposto de fazer uma "List" de temperatura em semestre sua media. Gostaria de sua correção sobre esse exercício. Exercicio00

Gostaria de saber se é essa a ideia. att Henrique

cami-la commented 2 years ago

Boa noite Camila! Acabei de assistir a sua mentoria na DIO.

Então, sobre o exercício proposto de fazer uma "List" de temperatura em semestre sua media. Gostaria de sua correção sobre esse exercício. Exercicio00

Gostaria de saber se é essa a ideia. att Henrique

Sim, Herique. Essa forma que você fez, é uma forma válida! Também fiz, só que utilizei o Strem API: https://github.com/cami-la/curso-dio-intro-collections/blob/master/src/br/com/dio/collection/list/ExercicioProposto01.java

Dá uma olhadinha para fazer uma comparação. ;)