Uso do array

2 respostas
netocazuza

No livro do Deitel tem um código interessante, onde ele simula um lançamento de um dado 6 mil vezes, e lista a frequência com que as faces se repetiram. Exemplo: Face1 958 vezes, face2 844 vezes, etc. Tudo isso de forma randômica. Compilei o código, e o adaptei pra mega sena. Ao invés de testar as seis faces de um dado, testei os 60 números da loteria, usando o mesmo princípio.
Como sou iniciante em Java, simplesmente repeti o código, implementando mais 54 variáveis, o que deixou o troço funcional, porém muito trabalhoso. Gostaria de saber, de acordo com as boas práticas da programação, como poderia fazer isso utilizando array, ou algo do gênero. Segue o código pra que dêem uma olhada.

import java.util.Random;
public class RollDie
{
        public static void main(String[] args)
        {
                Random randomNumbers = new Random(); // gerador de número aleatório
                int frequency1 = 0; // mantém a contagem de 1s lançados
                int frequency2 = 0; // contagem de 2s lançados
                int frequency3 = 0; // contagem de 3s lançados
                int frequency4 = 0; // contagem de 4s lançados
                int frequency5 = 0; // contagem de 5s lançados
                int frequency6 = 0; // contagem de 6s lançados
                int face; // armazena o valor lançado mais recentemente
                // soma 6.000 lançamentos de um dado
                for (int roll = 1; roll <+ 6000; roll++)
                {
                        face = 1 + randomNumbers.nextInt(6); // número entre 1 a 6
                        // define o valor de lançamento de 1 a 6 e incrementa o contador apropriado
                        switch (face)
                                {
                                        case 1:
                                        ++frequency1; // incrementa o contador de 1s
                                        break;
                                        case 2:
                                        ++frequency2; // incr. contador 2s
                                        break;
                                        case 3:
                                        ++frequency3; // incr. contador 3s
                                        break;
                                        case 4:
                                        ++frequency4;
                                        break;
                                        case 5:
                                        ++frequency5;
                                        break;
                                        case 6:
                                        ++frequency6;
                                        break;// opcional ao final do switch            
                                } // fim do switch      
                                                                                    42,3-24       20%

No meu código eu fiquei com 60 frequency (frequency1…frequency60),e no switch tive 60 case (case 1… case 60) e gostaria de saber como enxugar esse código com um array, ou outro recurso, principalmente na questão de listar as entradas também.

2 Respostas

Thishinoda

Vamos lá…

  1. um switch com 60 cases? LOL Nunca faça isso! Se ver que está usando demasiados “if” ou “case” no switch, pare e pense outra forma, você está fazendo algo errado!
  2. Pensando rápido, acho que uma maneira mais elegante de você fazer isso seria usar um mapa(chave, valor), onde a chave seria o número (1,2,3,etc…) e o valor a frequência.

Uma possível solução:

Map<Integer, Integer> mapa = new TreeMap<Integer, Integer>();
for (int roll = 1; roll <= 6000; roll++) {
     numero = 1 + randomNumbers.nextInt(6);
     //obtem do mapa aquele numero correspondente
     Integer frequencia = mapa.get(numero);
     //if ternário: se o valor for null, aplica-se 1 (inicia a contagem), se não for null aumenta a frequencia em 1
     frequencia = frequencia == null ? 1 : ++frequencia; 
     // atualiza o mapa com seu numero e frequencia
     mapa.put(numero, frequencia);
}
netocazuza

Desculpem amigos. Precipitação de principiante. Na página 226 do livro tem a solução do meu problema, usando array. Segue o código pra quem precisar. Já implementei aqui com outras variáveis e deu tudo certo.
import java.util.Random;

public class DadoArray
{
        public static void main (String[] args)
        {
                Random randomNumbers = new Random(); // gerador de nr. aleatór.
                int [] frequency = new int [7]; // array e cont. de frequência
                // lança os dados 6000 X; utiliza vl do dado cmo índice de freq
                for (int roll = 1; roll <= 6000; roll++)
                ++frequency[1 + randomNumbers.nextInt(6)];
                System.out.printf("%s%15s\n", "Lado", "Frequência");
                //Gera saída do valor de cada elemento do array
                for (int face = 1; face < frequency.length; face++)
                System.out.printf("%4d%10d\n", face, frequency[face]);
        } // fim de main

} // fim de classe
Criado 4 de fevereiro de 2016
Ultima resposta 6 de fev. de 2016
Respostas 2
Participantes 2