Obrigado pessoal;
Vejam o código, consigo gerar 1 aposta sem que se repita algum dos 15 números; agora estou batalhando para para que no universo de 3.268.760 apostas, nenhuma combinação entre 15 números seja igual.
public void executa(HttpServletRequest request, HttpServletResponse response)
throws Exception {
// Recebe dados sobre os numeros que serão sorteados
String[] getNumerosSorteio = request
.getParameterValues("numerosSorteio");
// Recebe os dados da view e grava em uma variável
long quantidadeJogos = Long.parseLong(request.getParameter("quantidadeJogos"));
// Cria uma lista de inteiros para receber os números para sorteio
// int[] setNumerosSorteio = null;
List<Integer> setNumerosSorteio = new ArrayList<Integer>();
for (int i = 0; i < getNumerosSorteio.length; i++) {
setNumerosSorteio.add(Integer.parseInt(getNumerosSorteio[i]));
}
// Cria um ArrayList de inteiros para armazenar as apostas geradas
List<Integer> prognosticos = new ArrayList<Integer>();
// Cria os jogos de acordo com a quantidade informada
for (int i = 0; i < quantidadeJogos; i++) {
// Instancia a classe Aposta para receber os dados da aposta
Aposta aposta = new Aposta();
// Pega idUsuario e grava para vincular com as apostas
Usuario usuario = SessaoApp.lerUsuario(request);
aposta.setUsuarioId(usuario.getIdUsuario());
/*
* Verifica qual o concurso está ativo
*/
// Instancia o objeto
ConcursoDao concursoDao = new ConcursoDao();
// Cria uma List para receber todos concursos
List<Concurso> concursos = concursoDao.getLista();
// Percorre a lista
for (Concurso concurso : concursos) {
// Verifica qual concurso está ativo
if (concurso.getConcursoAtivo() == true) {
// Armazena o idGrupo que esta ativo, somente um, devido a
// RN
aposta.setConcursoId(concurso.getIdConcurso());
}
}
// Informa o grupoId "1", ou seja, participa de aposta individual
aposta.setGrupoId(1);
/*
* Captura a data atual Foi utilizado o Calendar pois a data será
* trabalhada
*/
aposta.setDataAposta(Calendar.getInstance());
// Marca a aposta como Ativa
aposta.setApostaAtiva(true);
// Instancia a classe ApostaDao para adiconar o objeto ao BD
ApostaDao apostaDao = new ApostaDao();
// Adiciona a aposta
apostaDao.adicionar(aposta);
// Lógica para gerar as combinações
// Cria 15 objetos para a selecao (List)
for (int j = 0; j < 15; j++) {
// Recebe um número aleatório entre 1 e 25
int r = (int) (1 + (Math.random() * 25));
// Verifica se "r" está na colecao (List)
// Se contem, gera um novo numero que não se repita
while (prognosticos.contains(r))
// caso positivo, gera novo número
r = (int) (1 + (Math.random() * 25));
prognosticos.add(r);
}
PrognosticoAposta prognosticoAposta = new PrognosticoAposta();
PrognosticoApostaDao prognosticoApostaDao = new PrognosticoApostaDao();
// Aposta aposta = new Aposta();
// Percorre o array, insere dados no objeto e grava no BD
for (Integer prognostico : prognosticos) {
// Insere dados no objeto
prognosticoAposta.setApostaId(aposta.getIdAposta());
prognosticoAposta.setPrognosticoAposta(prognostico);
// Antes de gravar, preciso verificar se a aposta já existe, como?
// Grava no BD
prognosticoApostaDao.adicionar(prognosticoAposta);
}
// Limpa a lista para receber novos números
prognosticos.clear();
}
request.setAttribute("mensagem", "Aposta adicionada com sucesso!"); // mensagem
request.setAttribute("destino", "aposta-automatica-lotofacil.jsp"); // destino
// Redireciona para servlet Mensagem
request.getRequestDispatcher("Mensagem").forward(request, response);
}
Vou fazer uma analogia do que estou pensando:
Criar uma List MAE.
Criar uma List FILHA.
A FILHA terá um combinação de 15 prognósticos (números) que não se repetem entre si.
Logo, ela vai até a MAE e verifica se existe uma outro igual à FILHA.
Se não existir, ela se grava na LIST MAE, caso contrário, ela não grava e gera um nova combinação de 15 prognósticos para verificar novamente se existe, e assim vai.
Quando a MAE receber as 3 milhões de combinações que não se repetem, ela irá gravas as combinações no Banco de Dados.
Se for isso, como faria a implementação pra comparar duas LIST?
Ah, meu BD (MySQL) está gravando assim (exemplo):
Ambos são BIGINT:
apostaId | prognosticoAposta
1 | 10
1 | 7
1 | 9
1 | 2
1 | 14
1 | 23
2 | 18
2 | 23
2 | 25
2 | 1
2 | 5
Pessoal, se precisar de algo para esclarecer o código é so falar hein, sugestões são bem vindas! Flw