Uso do array

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.

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);
}
1 curtida

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