Mega Sena - caso prático p/ aprender Java

13 respostas
ricardospinoza

Como comigo o aprendizado só funciona na prática, eis minhas dúvidas!!!

Primeiro o código:

Classe DataminingMegaSena
package sorte;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class DataminingMegaSena {
	
	public static Double formataStringToDouble(String strNro) {				
		String strAux;
		String strRetorno = strNro;
		Boolean ponto = false;
		Boolean virgula = false;
			
		if (strNro.indexOf(",") != -1)
			virgula = true;		
		if(strNro.indexOf(".") != -1)
			ponto = true;			
		
		if (virgula && ponto){			
			strRetorno = strNro.replace(".", "");
			strAux = strRetorno.replace(",", ".");
			strRetorno = strAux;						
		}
		else if(virgula)
			strRetorno = strNro.replace(",", ".");
		return Double.parseDouble(strRetorno);
	}

	public static void main(String[] args) {

		int LIMITE_CONCURSOS = 2000;
		int QTDE_DEZENAS_CARTELA = 60;
		URL u;
		InputStream is = null;
		DataInputStream dis;
		String strConteudo = new String();
		Sorteio sorteio[] = new Sorteio[LIMITE_CONCURSOS];
		String strArray[] = new String[16];

		try {
			u = new URL("http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_megase.zip");
			is = u.openStream();

			ZipInputStream zin = new ZipInputStream(is);
			ZipEntry ze = null;

			while ((ze = zin.getNextEntry()) != null) {
				System.out.println("Descompactando Zip: " + ze.getName());
				FileOutputStream fout = new FileOutputStream(ze.getName());
				for (int c = zin.read(); c != -1; c = zin.read()) {
					fout.write(c);
				}
				zin.closeEntry();
				fout.close();
			}
			zin.close();

			File file = new File("D_MEGA.HTM");
			FileInputStream fis = null;
			BufferedInputStream bis = null;

			try {
				fis = new FileInputStream(file);
				bis = new BufferedInputStream(fis);
				dis = new DataInputStream(bis);

				int idx = 0;
				int idxSorteio = 0;
				
				Date dt = new Date();
				String strData;

				while (dis.available() != 0) {

					strConteudo = dis.readLine();
					if (strConteudo.indexOf("</td>") != -1) {
												
						strArray[idx] = strConteudo.replaceAll("<td>", "").replaceAll("</td>", "").trim();
						//System.out.println("[" + strArray[idx] + "]");
						if (idx == 15) {							 				
						
							sorteio[idxSorteio] = new Sorteio();//criado objeto CLiente  
							//System.out.println("0[" + strArray[0] + "]");

							sorteio[idxSorteio].setNConcurso(Integer.parseInt(strArray[0]));
							
							strData = strArray[1];
														
							SimpleDateFormat f = new SimpleDateFormat("DD/MM/yyyy");
							try {
								dt = f.parse(strData);//Converte uma string em data no formato específico
							} catch (ParseException e) {								
								e.printStackTrace();
							}
							
							//System.out.println("1[" + strArray[1] + "]");
							sorteio[idxSorteio].setDataSorteio(dt);		
							
							//System.out.println("2[" + strArray[2] + "]");
							sorteio[idxSorteio].setDezena1(Integer.parseInt(strArray[2]));
							//System.out.println("3[" + strArray[3] + "]");							
							sorteio[idxSorteio].setDezena2(Integer.parseInt(strArray[3]));
							//System.out.println("4[" + strArray[4] + "]");
							sorteio[idxSorteio].setDezena3(Integer.parseInt(strArray[4]));
							//System.out.println("5[" + strArray[5] + "]");
							sorteio[idxSorteio].setDezena4(Integer.parseInt(strArray[5]));
							//System.out.println("6[" + strArray[6] + "]");
							sorteio[idxSorteio].setDezena5(Integer.parseInt(strArray[6]));
							//System.out.println("7[" + strArray[7] + "]");
							sorteio[idxSorteio].setDezena6(Integer.parseInt(strArray[7]));
							//System.out.println("8[" + strArray[8] + "]");
							sorteio[idxSorteio].setGanhadoresSena(Integer.parseInt(strArray[8]));
							//System.out.println("9[" + strArray[9] + "]");
							sorteio[idxSorteio].setRateioSena(formataStringToDouble(strArray[9]));
							//System.out.println("10[" + strArray[10] + "]");
							sorteio[idxSorteio].setGanhadoresQuina(Integer.parseInt(strArray[10]));
							//System.out.println("11[" + strArray[11] + "]");
							sorteio[idxSorteio].setRateioQuina(formataStringToDouble(strArray[11]));
							//System.out.println("12[" + strArray[12] + "]");
							sorteio[idxSorteio].setGanhadoresQuadra(Integer.parseInt(strArray[12]));
							//System.out.println("13[" + strArray[13] + "]");
							sorteio[idxSorteio].setRateioQuadra(formataStringToDouble(strArray[13]));
							//System.out.println("14[" + strArray[14] + "]");
							sorteio[idxSorteio].setAcumulado((String)  strArray[14]);
							//System.out.println("15[" + strArray[15] + "]");
							sorteio[idxSorteio].setValorAcumulado(formataStringToDouble(strArray[15]));
							
							idx = -1;
							idxSorteio++;
						}//end if idx == 15
						idx++;						
					}//end if <td>
				}//end while
				fis.close();
				bis.close();
				dis.close();
				
				//System.out.println(sorteio.length);
				//Frequência de sorteio das dezenas sorteios:
				
				//apenas imprime de 1 a 60, pretendo mais além fazer uma soma dos totais por dezena
				for (int j = 1; j < QTDE_DEZENAS_CARTELA+1; j++){
					if (j % 10 == 0 ){					
						System.out.println(j);						
					}
					else {
						if (j < 10)
							System.out.print("0"+j+" - ");
						else
							System.out.print(j+" - ");
					}
				}
			}
			catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			catch (IOException e) {
				e.printStackTrace();
			}
		}
		catch (MalformedURLException mue) {

			System.out.println("Ouch - a MalformedURLException happened.");
			mue.printStackTrace();
			System.exit(1);

		}
		catch (IOException ioe) {

			System.out.println("Oops- an IOException happened.");
			ioe.printStackTrace();
			System.exit(1);

		}
		finally {
			try {
				is.close();
			}
			catch (IOException ioe) {
				// just going to ignore this one
			}
		} // end of 'finally' clause
	} // end of main
}

Classe Sorteio

package sorte;

import java.util.Date;

public class Sorteio {

	int nConcurso;
	Date dataSorteio;
	int dezena1;
	int dezena2;
	int dezena3;
	int dezena4;
	int dezena5;
	int dezena6;
	int ganhadoresSena;
	double rateioSena;
	int ganhadoresQuina;
	double rateioQuina;
	int ganhadoresQuadra;
	double rateioQuadra;
	String acumulado;
	double valorAcumulado;

	public int getNConcurso() {
		return nConcurso;
	}

	public void setNConcurso(int concurso) {
		nConcurso = concurso;
	}

	public Date getDataSorteio() {
		return dataSorteio;
	}

	public void setDataSorteio(Date dataSorteio) {
		this.dataSorteio = dataSorteio;
	}

	public int getDezena1() {
		return dezena1;
	}

	public void setDezena1(int dezena1) {
		this.dezena1 = dezena1;
	}

	public int getDezena2() {
		return dezena2;
	}

	public void setDezena2(int dezena2) {
		this.dezena2 = dezena2;
	}

	public int getDezena3() {
		return dezena3;
	}

	public void setDezena3(int dezena3) {
		this.dezena3 = dezena3;
	}

	public int getDezena4() {
		return dezena4;
	}

	public void setDezena4(int dezena4) {
		this.dezena4 = dezena4;
	}

	public int getDezena5() {
		return dezena5;
	}

	public void setDezena5(int dezena5) {
		this.dezena5 = dezena5;
	}

	public int getDezena6() {
		return dezena6;
	}

	public void setDezena6(int dezena6) {
		this.dezena6 = dezena6;
	}

	public int getGanhadoresSena() {
		return ganhadoresSena;
	}

	public void setGanhadoresSena(int ganhadoresSena) {
		this.ganhadoresSena = ganhadoresSena;
	}

	public double getRateioSena() {
		return rateioSena;
	}

	public void setRateioSena(double rateioSena) {
		this.rateioSena = rateioSena;
	}

	public int getGanhadoresQuina() {
		return ganhadoresQuina;
	}

	public void setGanhadoresQuina(int ganhadoresQuina) {
		this.ganhadoresQuina = ganhadoresQuina;
	}

	public double getRateioQuina() {
		return rateioQuina;
	}

	public void setRateioQuina(double rateioQuina) {
		this.rateioQuina = rateioQuina;
	}

	public int getGanhadoresQuadra() {
		return ganhadoresQuadra;
	}

	public void setGanhadoresQuadra(int ganhadoresQuadra) {
		this.ganhadoresQuadra = ganhadoresQuadra;
	}

	public double getRateioQuadra() {
		return rateioQuadra;
	}

	public void setRateioQuadra(double rateioQuadra) {
		this.rateioQuadra = rateioQuadra;
	}

	public String getAcumulado() {
		return acumulado;
	}

	public void setAcumulado(String acumulado) {
		this.acumulado = acumulado;
	}

	public double getValorAcumulado() {
		return valorAcumulado;
	}

	public void setValorAcumulado(double valorAcumulado) {
		this.valorAcumulado = valorAcumulado;
	}
}

Na classe DataminingMegaSena eu importo o zip da caixa com os dados dos sorteios da megasena, e extraio o conteúdo para um array do tipo objeto. Até aqui fui juntando fragmentos de exemplos que encontrei aqui no forúm!!!

Gostaria de sua sugestão de como posso obter todos os nros sorteados por dezenas, por exemplo, a dezena 13 foi sorteada 114, a dezena 29 foi sorteada 114, etc... Eu tenho um array com varios objetos sorteio, como obter o totais? Gostaria de sugestões e opiniões, pois ajuda a abrir a kbça para novas possibilidades... :)

13 Respostas

71C4700

Eu criaria um classe contendo o numero e a quantidade de vezes que ele foi sorteado ai quando encontrasse ele novamente era só incrementar a quantidade.

class Algo{ private int numero; // Numero sorteado private int quantNumero; // Quatidade de vezes }

Inté…

ricardospinoza

71C4700:
Eu criaria um classe contendo o numero e a quantidade de vezes que ele foi sorteado ai quando encontrasse ele novamente era só incrementar a quantidade.

class Algo{ private int numero; // Numero sorteado private int quantNumero; // Quatidade de vezes }

Inté…

Obrigado por responder, gostei da idéia. Estou com o código na minha máquina em casa e de noite irá tentar por em pratica a sua dica. obrigado… :wink:

71C4700

Não tem de que…

ricardospinoza

Consegui fazer a contagem de cada dezena, ficou assim o código:

ContagemDezenas - Trabalha com um cara chamado de Map (pelo que entendi, mapeia chave->valor) onde o indice(chave) é a própria dezena, o segundo parametro(valor) é a quantidade de vezes que a dezena ocorreu.
package sorte;

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

public class ContagemDezenas {
	
	private static Map<Integer, Integer> mapContabilizaSorteio = new HashMap<Integer, Integer>();

	public int getNroVezesQueDezenaFoiSorteada(int dezena) {
		return mapContabilizaSorteio.get(dezena);		
	}

	public void addContagemDeDezenaSorteada(int dezena) {
		if (mapContabilizaSorteio.get(dezena) != null)			
			mapContabilizaSorteio.put(dezena, mapContabilizaSorteio.get(dezena)+1);
		else
			mapContabilizaSorteio.put(dezena, 1);				
	}
}

A classe principal ficou assim:

package sorte;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class DataMiningMegaSena {
	
	public static Double formataStringToDouble(String strNro) {				
		String strAux;
		String strRetorno = strNro;
		Boolean ponto = false;
		Boolean virgula = false;
			
		if (strNro.indexOf(",") != -1)
			virgula = true;		
		if(strNro.indexOf(".") != -1)
			ponto = true;			
		
		if (virgula && ponto){			
			strRetorno = strNro.replace(".", "");
			strAux = strRetorno.replace(",", ".");
			strRetorno = strAux;						
		}
		else if(virgula)
			strRetorno = strNro.replace(",", ".");
		return Double.parseDouble(strRetorno);
	}

	public static void main(String[] args) {

		int LIMITE_CONCURSOS = 2000;
		int QTDE_DEZENAS_CARTELA = 60;
		URL u;
		InputStream is = null;
		DataInputStream dis;
		String strConteudo = new String();
		Sorteio sorteio[] = new Sorteio[LIMITE_CONCURSOS];
		String strArray[] = new String[16];
		ContagemDezenas contadorDezenas = new ContagemDezenas();
		try {
			u = new URL("http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_megase.zip");
			is = u.openStream();

			ZipInputStream zin = new ZipInputStream(is);
			ZipEntry ze = null;

			while ((ze = zin.getNextEntry()) != null) {
				System.out.println("Descompactando Zip: " + ze.getName());
				FileOutputStream fout = new FileOutputStream(ze.getName());
				for (int c = zin.read(); c != -1; c = zin.read()) {
					fout.write(c);
				}
				zin.closeEntry();
				fout.close();
			}
			zin.close();

			File file = new File("D_MEGA.HTM");
			FileInputStream fis = null;
			BufferedInputStream bis = null;

			try {
				fis = new FileInputStream(file);
				bis = new BufferedInputStream(fis);
				dis = new DataInputStream(bis);

				int idx = 0;
				int idxSorteio = 0;
				
				Date dt = new Date();
				String strData;

				while (dis.available() != 0) {

					strConteudo = dis.readLine();
					if (strConteudo.indexOf("</td>") != -1) {
						
						strArray[idx] = strConteudo.replaceAll("<td>", "").replaceAll("</td>", "").trim();
						
						if (idx == 15) {							 				
						
							sorteio[idxSorteio] = new Sorteio();//criado objeto CLiente  
							//System.out.println("0[" + strArray[0] + "]");

							sorteio[idxSorteio].setNConcurso(Integer.parseInt(strArray[0]));//Concurso
							
							strData = strArray[1];
														
							SimpleDateFormat f = new SimpleDateFormat("DD/MM/yyyy");
							try {
								dt = f.parse(strData);//Converte uma string em data no formato específico
							}
							catch (ParseException e) {								
								e.printStackTrace();
							}
							
							//System.out.println("1[" + strArray[1] + "]");
							sorteio[idxSorteio].setDataSorteio(dt);	//Data Sorteio
							
							//System.out.println("2[" + strArray[2] + "]");
							sorteio[idxSorteio].setDezena1(Integer.parseInt(strArray[2]));//1ª Dezena
							contadorDezenas.addContagemDeDezenaSorteada(sorteio[idxSorteio].getDezena1());
							//System.out.println("3[" + strArray[3] + "]");							
							sorteio[idxSorteio].setDezena2(Integer.parseInt(strArray[3]));//2ª Dezena
							contadorDezenas.addContagemDeDezenaSorteada(sorteio[idxSorteio].getDezena2());
							//System.out.println("4[" + strArray[4] + "]");
							sorteio[idxSorteio].setDezena3(Integer.parseInt(strArray[4]));//3ª Dezena
							contadorDezenas.addContagemDeDezenaSorteada(sorteio[idxSorteio].getDezena3());
							//System.out.println("5[" + strArray[5] + "]");
							sorteio[idxSorteio].setDezena4(Integer.parseInt(strArray[5]));//4ª Dezena
							contadorDezenas.addContagemDeDezenaSorteada(sorteio[idxSorteio].getDezena4());
							//System.out.println("6[" + strArray[6] + "]");
							sorteio[idxSorteio].setDezena5(Integer.parseInt(strArray[6]));//5ª Dezena
							contadorDezenas.addContagemDeDezenaSorteada(sorteio[idxSorteio].getDezena5());
							//System.out.println("7[" + strArray[7] + "]");
							sorteio[idxSorteio].setDezena6(Integer.parseInt(strArray[7]));//6ª Dezena
							contadorDezenas.addContagemDeDezenaSorteada(sorteio[idxSorteio].getDezena6());
							//System.out.println("8[" + strArray[8] + "]");
							sorteio[idxSorteio].setGanhadoresSena(Integer.parseInt(strArray[8]));//Ganhadores_Sena
							//System.out.println("9[" + strArray[9] + "]");
							sorteio[idxSorteio].setRateioSena(formataStringToDouble(strArray[9]));//Rateio_Sena 
							//System.out.println("10[" + strArray[10] + "]");
							sorteio[idxSorteio].setGanhadoresQuina(Integer.parseInt(strArray[10]));//Ganhadores_Quina 
							//System.out.println("11[" + strArray[11] + "]");
							sorteio[idxSorteio].setRateioQuina(formataStringToDouble(strArray[11]));//Rateio_Quina 
							//System.out.println("12[" + strArray[12] + "]");
							sorteio[idxSorteio].setGanhadoresQuadra(Integer.parseInt(strArray[12]));//Ganhadores_Quadra 
							//System.out.println("13[" + strArray[13] + "]");
							sorteio[idxSorteio].setRateioQuadra(formataStringToDouble(strArray[13]));//Rateio_Quadra  
							//System.out.println("14[" + strArray[14] + "]");
							sorteio[idxSorteio].setAcumulado((String)  strArray[14]);//Acumulado 
							//System.out.println("15[" + strArray[15] + "]");
							sorteio[idxSorteio].setValorAcumulado(formataStringToDouble(strArray[15]));//Valor_Acumulado 
							
							idx = -1;
							idxSorteio++;
						}//end if idx == 15
						idx++;						
					}//end if <td>
				}//end while
				fis.close();
				bis.close();
				dis.close();
				
				//System.out.println(sorteio.length);
				//Frequência de sorteio das dezenas sorteios:
				
				//apenas imprime 1 a 60 com o total de cada dezena
				for (int j = 1; j < QTDE_DEZENAS_CARTELA+1; j++) {
					if (j % 10 == 0 ){					
						System.out.println(j + "{"+contadorDezenas.getNroVezesQueDezenaFoiSorteada(j)+")");						
					}
					else {
						if (j < 10)
							System.out.print("0"+j+ "{"+contadorDezenas.getNroVezesQueDezenaFoiSorteada(j)+") - ");
						else
							System.out.print(j+ "{"+contadorDezenas.getNroVezesQueDezenaFoiSorteada(j)+") - ");
					}
				}
			}
			catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			catch (IOException e) {
				e.printStackTrace();
			}
		}
		catch (MalformedURLException mue) {

			System.out.println("Ouch - a MalformedURLException happened.");
			mue.printStackTrace();
			System.exit(1);

		}
		catch (IOException ioe) {

			System.out.println("Oops- an IOException happened.");
			ioe.printStackTrace();
			System.exit(1);

		}
		finally {
			try {
				is.close();
			}
			catch (IOException ioe) {
				// just going to ignore this one
			}
		} // end of 'finally' clause
	} // end of main
}
71C4700

Gostei…Muito bom…

B

Poderia usar mais estruturas pra organizar o trabalho. Dezenas podem ir num array de 6 posições, os dados sobre rateio e ganhadores de cada combinação de jogo numa estrutura de estatísticas. Fora não ficar criando sets e gets a torto e a direito, construtores também existem.

ricardospinoza

Bruno, obrigado por responder. Gostei da dica, vou modificar o código para melhora-lo, e retorno :smiley:

ricardospinoza

Estava pensando aqui com os meus botões… tenho a classe Sorteio que seto valores à medida que o meu laço está sendo executado, faço a contagem de quantas vezes cada dezena caiu usando uma classe com map estático.
Agora gostaria de adaptar o código lembrar o ultimo concurso em que a dezena caiu e quanto tempo faz que está dezena não é sorteada.
Pretendo obter a frequência de sorteio de cada dezena, neste caso seria interessante adicionar o concurso na classe map? criar uma para conter estatística do jogo?
Gostaria de aproveitar e pedir um exemplo de uso de construtor para evitar os excesso de get´s e setter´s.

Obs. modifiquei os atributos dezena1, dezena2…, dezena6 em um array contendo 6 dezenas conforme sugerido (só não postei, por que o código está na minha máquina do trabalho :lol: )

luistiagos

Creio que este tipo de coisa não adianta muito… se funcionasse teria um monte de gete milhonaria porai… os numeros da mega sena são sorteados dependendo de um fator: sorte… o comportamento deste jogo não é ciclico e nem depende de fatores esternos… isto complica a previsão de valores… ainda não testei este tipo de coisa mas acredito que o resultado seria totalmente desproporcional… quando existe algo que tem um comportamente ciclico ou depende de fatores para ocasionar determinada situação a frequencia no comportamento ciclico ou os fatores que influenciam o comportamento pode reduzir o fator de erro a valores consideraveis… mas neste caso são desconhecidas as influencias do meio sobre os resultados… ou seja isso so depende de sorte e nada mais… garanto pra vc que é bem mais facil se vc fissese um algoritimo para prever a bolsa de valores pois ela sim é influenciada por inumeros fatores o problema é conhecer todos os fatores e algo que consiga processar tdo isso talvez um computador quantico faria este serviço… poderia usar automatos celulares para isto…

ricardospinoza

luistiagos, obrigado por responder. De fato seria muita pretensão minha querer adivinhar os números que seriam sorteados :smiley: (afinal, a mega é um jogo de azar), mas o meu objetivo é meramente aprender java, e escolhi o tema mega sena por sua regra de negócio familiar à boa parte das pessoas :slight_smile:

B

ricardospinoza:
Estava pensando aqui com os meus botões… tenho a classe Sorteio que seto valores à medida que o meu laço está sendo executado, faço a contagem de quantas vezes cada dezena caiu usando uma classe com map estático.
Agora gostaria de adaptar o código lembrar o ultimo concurso em que a dezena caiu e quanto tempo faz que está dezena não é sorteada.
Pretendo obter a frequência de sorteio de cada dezena, neste caso seria interessante adicionar o concurso na classe map? criar uma para conter estatística do jogo?
Gostaria de aproveitar e pedir um exemplo de uso de construtor para evitar os excesso de get´s e setter´s.

Eu criaria uma classe Dezena para representar a própria, e seus metadados, como a quantidade e essa última vez que foi sorteada. Dentro dela um método, talvez com o nome atualizar, que aumentasse a contagem, e atualizasse a data de Sorteio, ou mais especificamente, seria o próprio sorteio.

Sobre construtores, primeiro crie métodos que passando o array de string, retornem um array de Dezenas, e outros que talvez retornem Metadados sobre o Sorteio (crie uma classe SorteioMetadata). Depois só fazer um sorteio = new Sorteio(dezenas, metadadosDoSorteio);

ricardospinoza

Bruno Laturner:
ricardospinoza:
Estava pensando aqui com os meus botões… tenho a classe Sorteio que seto valores à medida que o meu laço está sendo executado, faço a contagem de quantas vezes cada dezena caiu usando uma classe com map estático.
Agora gostaria de adaptar o código lembrar o ultimo concurso em que a dezena caiu e quanto tempo faz que está dezena não é sorteada.
Pretendo obter a frequência de sorteio de cada dezena, neste caso seria interessante adicionar o concurso na classe map? criar uma para conter estatística do jogo?
Gostaria de aproveitar e pedir um exemplo de uso de construtor para evitar os excesso de get´s e setter´s.

Eu criaria uma classe Dezena para representar a própria, e seus metadados, como a quantidade e essa última vez que foi sorteada. Dentro dela um método, talvez com o nome atualizar, que aumentasse a contagem, e atualizasse a data de Sorteio, ou mais especificamente, seria o próprio sorteio.

Sobre construtores, primeiro crie métodos que passando o array de string, retornem um array de Dezenas, e outros que talvez retornem Metadados sobre o Sorteio (crie uma classe SorteioMetadata). Depois só fazer um sorteio = new Sorteio(dezenas, metadadosDoSorteio);

Bruno, obrigado por responder. Interessante está abordagem… se entendi bem, toda a vez que eu der um new na classe Sorteio no laço, eu atualizo minha classe dezena sem precisar fazer um contador dentro do for? é isto mesmo? estou imaginando como implementar :shock:

ricardospinoza

Mudei o esquema de contagem das dezenas, atribuindo a responsabilidade de contar as dezenas para o objeto Sorteio, e no final do laço eu chamo o método getTotalPorDezena() que retorna a somatória (achei que ficou uma POG :oops:).

Gostaria de saber se é este mesmo o caminho?

Sorteio

package sorte;

import java.util.Date;

public class Sorteio {

	private int nConcurso;
	private Date dataSorteio;
	
	private int dezena[];

	private int ganhadoresSena;
	private double rateioSena;
	private int ganhadoresQuina;
	private double rateioQuina;
	private int ganhadoresQuadra;
	private double rateioQuadra;
	private String acumulado;
	private double valorAcumulado;
	
	private ContagemDezenas contadorDezenas;
	
	public Sorteio(){
		this.dezena = new int[6];//representa 6 dezenas do sorteio
		contadorDezenas = new ContagemDezenas();
	}

	public int getNConcurso() {
		return nConcurso;
	}

	public void setNConcurso(int concurso) {
		nConcurso = concurso;
	}

	public Date getDataSorteio() {
		return dataSorteio;
	}

	public void setDataSorteio(Date dataSorteio) {
		this.dataSorteio = dataSorteio;
	}

	public int getGanhadoresSena() {
		return ganhadoresSena;
	}

	public void setGanhadoresSena(int ganhadoresSena) {
		this.ganhadoresSena = ganhadoresSena;
	}

	public double getRateioSena() {
		return rateioSena;
	}

	public void setRateioSena(double rateioSena) {
		this.rateioSena = rateioSena;
	}

	public int getGanhadoresQuina() {
		return ganhadoresQuina;
	}

	public void setGanhadoresQuina(int ganhadoresQuina) {
		this.ganhadoresQuina = ganhadoresQuina;
	}

	public double getRateioQuina() {
		return rateioQuina;
	}

	public void setRateioQuina(double rateioQuina) {
		this.rateioQuina = rateioQuina;
	}

	public int getGanhadoresQuadra() {
		return ganhadoresQuadra;
	}

	public void setGanhadoresQuadra(int ganhadoresQuadra) {
		this.ganhadoresQuadra = ganhadoresQuadra;
	}

	public double getRateioQuadra() {
		return rateioQuadra;
	}

	public void setRateioQuadra(double rateioQuadra) {
		this.rateioQuadra = rateioQuadra;
	}

	public String getAcumulado() {
		return acumulado;
	}

	public void setAcumulado(String acumulado) {
		this.acumulado = acumulado;
	}

	public double getValorAcumulado() {
		return valorAcumulado;
	}

	public void setValorAcumulado(double valorAcumulado) {
		this.valorAcumulado = valorAcumulado;
	}
	
	public int getDezena(int idx){
		return dezena[idx];
	}

	public void setDezena(int iDezena, int posicao) {
		this.dezena[posicao] = iDezena;		
		contadorDezenas.addContagemDeDezenaSorteada(this.getDezena(posicao));
	}
	
	//Este metodo é chamado no ultimo objeto Sorteio criado na classe DataMiningMegaSena
	public void getTotalPorDezena() {
		//apenas imprime 1 a 60 com o total de cada dezena		
		int QTDE_DEZENAS_CARTELA = 60;
		for (int j = 1; j < QTDE_DEZENAS_CARTELA+1; j++) {
			if (j % 10 == 0 ) {					
				System.out.println(j + "{"+contadorDezenas.getNroVezesQueDezenaFoiSorteada(j)+")");						
			}
			else {
				if (j < 10)
					System.out.print("0"+j+ "{"+contadorDezenas.getNroVezesQueDezenaFoiSorteada(j)+") - ");
				else
					System.out.print(j+ "{"+contadorDezenas.getNroVezesQueDezenaFoiSorteada(j)+") - ");
			}
		}//fim for	
	}//fim getTotalPorDezena
}

ContagemDezenas

package sorte;

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

public class ContagemDezenas {
	
	private static Map<Integer, Integer> mapContabilizaSorteio = new HashMap<Integer, Integer>();

	public int getNroVezesQueDezenaFoiSorteada(int dezena) {
		return mapContabilizaSorteio.get(dezena);		
	}

	public void addContagemDeDezenaSorteada(int dezena) {
		if (mapContabilizaSorteio.get(dezena) != null)			
			mapContabilizaSorteio.put(dezena, mapContabilizaSorteio.get(dezena)+1);
		else
			mapContabilizaSorteio.put(dezena, 1);				
	}
}

DataMiningMegaSena

package sorte;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class DataMiningMegaSena {
	
	public interface DEZENA{
		int primeira = 0;
		int segunda = 1;
		int terceira = 2;
		int quarta = 3;
		int quinta = 4;
		int sexta = 5;		
	}
	
	public static Double formataStringToDouble(String strNro) {				
		String strAux;
		String strRetorno = strNro;
		Boolean ponto = false;
		Boolean virgula = false;
			
		if (strNro.indexOf(",") != -1)
			virgula = true;		
		if(strNro.indexOf(".") != -1)
			ponto = true;			
		
		if (virgula && ponto){			
			strRetorno = strNro.replace(".", "");
			strAux = strRetorno.replace(",", ".");
			strRetorno = strAux;						
		}
		else if(virgula)
			strRetorno = strNro.replace(",", ".");
		return Double.parseDouble(strRetorno);
	}

	public static void main(String[] args) {

		int LIMITE_CONCURSOS = 2000;		
		URL u;
		InputStream is = null;
		DataInputStream dis;
		String strConteudo = new String();
		Sorteio sorteio[] = new Sorteio[LIMITE_CONCURSOS];
		String strArray[] = new String[16];		
		try {
			u = new URL("http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_megase.zip");
			is = u.openStream();

			ZipInputStream zin = new ZipInputStream(is);
			ZipEntry ze = null;

			while ((ze = zin.getNextEntry()) != null) {
				System.out.println("Descompactando Zip: " + ze.getName());
				FileOutputStream fout = new FileOutputStream(ze.getName());
				for (int c = zin.read(); c != -1; c = zin.read()) {
					fout.write(c);
				}
				zin.closeEntry();
				fout.close();
			}
			zin.close();

			File file = new File("D_MEGA.HTM");
			FileInputStream fis = null;
			BufferedInputStream bis = null;

			try {
				fis = new FileInputStream(file);
				bis = new BufferedInputStream(fis);
				dis = new DataInputStream(bis);

				int idx = 0;
				int idxSorteio = 0;
				
				Date dt = new Date();
				String strData;

				while (dis.available() != 0) {

					strConteudo = dis.readLine();
					if (strConteudo.indexOf("</td>") != -1) {
						
						strArray[idx] = strConteudo.replaceAll("<td>", "").replaceAll("</td>", "").trim();
						
						if (idx == 15) {							 				
						
							sorteio[idxSorteio] = new Sorteio();
							
							sorteio[idxSorteio].setNConcurso(Integer.parseInt(strArray[0]));//Concurso
							
							strData = strArray[1];
														
							SimpleDateFormat f = new SimpleDateFormat("DD/MM/yyyy");
							try {
								dt = f.parse(strData);//Converte uma string em data no formato específico
							}
							catch (ParseException e) {								
								e.printStackTrace();
							}
							
							sorteio[idxSorteio].setDataSorteio(dt);//Data Sorteio
							sorteio[idxSorteio].setDezena(Integer.parseInt(strArray[2]), DEZENA.primeira );	//1ª Dezena
							sorteio[idxSorteio].setDezena(Integer.parseInt(strArray[3]), DEZENA.segunda);	//2ª Dezena
							sorteio[idxSorteio].setDezena(Integer.parseInt(strArray[4]), DEZENA.terceira);	//3ª Dezena
							sorteio[idxSorteio].setDezena(Integer.parseInt(strArray[5]), DEZENA.quarta);	//4ª Dezena
							sorteio[idxSorteio].setDezena(Integer.parseInt(strArray[6]), DEZENA.quinta);	//5ª Dezena
							sorteio[idxSorteio].setDezena(Integer.parseInt(strArray[7]), DEZENA.sexta);		//6ª Dezena
							sorteio[idxSorteio].setGanhadoresSena(Integer.parseInt(strArray[8]));			//Ganhadores_Sena
							sorteio[idxSorteio].setRateioSena(formataStringToDouble(strArray[9]));			//Rateio_Sena 
							sorteio[idxSorteio].setGanhadoresQuina(Integer.parseInt(strArray[10]));			//Ganhadores_Quina 
							sorteio[idxSorteio].setRateioQuina(formataStringToDouble(strArray[11]));		//Rateio_Quina 
							sorteio[idxSorteio].setGanhadoresQuadra(Integer.parseInt(strArray[12]));		//Ganhadores_Quadra 
							sorteio[idxSorteio].setRateioQuadra(formataStringToDouble(strArray[13]));		//Rateio_Quadra  
							sorteio[idxSorteio].setAcumulado((String)  strArray[14]);						//Acumulado 
							sorteio[idxSorteio].setValorAcumulado(formataStringToDouble(strArray[15]));		//Valor_Acumulado 
							
							idx = -1;
							idxSorteio++;
						}//end if idx == 15
						idx++;
					}//end if <td>
				}//end while
				fis.close();
				bis.close();
				dis.close();				
						
				//Pego o utlimo objeto sorteio e imprimo o total. Ficou com cara de POG
				sorteio[idxSorteio-1].getTotalPorDezena();				
			}
			catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			catch (IOException e) {
				e.printStackTrace();
			}
		}
		catch (MalformedURLException mue) {

			System.out.println("Ouch - a MalformedURLException happened.");
			mue.printStackTrace();
			System.exit(1);

		}
		catch (IOException ioe) {

			System.out.println("Oops- an IOException happened.");
			ioe.printStackTrace();
			System.exit(1);

		}
		finally {
			try {
				is.close();
			}
			catch (IOException ioe) {
				// just going to ignore this one
			}
		} // end of 'finally' clause
	} // end of main
}
Criado 20 de janeiro de 2009
Ultima resposta 3 de fev. de 2009
Respostas 13
Participantes 4