Chamar Arraylist de outro classe

37 respostas
M

Queria puxar um Arraylist para a outra classe, como faço?

37 Respostas

Lucas_Camara

Deve ter como fazer algo assim:

List<SeuObjet> seuArrayList = outraClasse.getSuaLista();

Foi mal, Não entendi exatamente a dificuldade.

M

É por que esse Arraylist está dentro do método main.

Lucas_Camara

Dessa forma não é possivel acessar esse arraylist de outro lugar. Se quiser acessar essa lista, você deve colocá-la como atributo de classe e disponibilizar um método para acessar esse atributo.

M

puts

Lucas_Camara

Como está esse seu método main?

M

A arraylist no caso é “resultados”

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSpan;
import com.gargoylesoftware.htmlunit.html.HtmlTable; 
import com.gargoylesoftware.htmlunit.html.HtmlTableCell;
import java.io.IOException;
import java.net.CookieHandler; 
import java.net.CookieManager;
import java.net.CookiePolicy; 
import java.util.ArrayList; 
import java.util.List; 

public class Loto {

	public static void main(String[] args) throws IOException {
		java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(java.util.logging.Level.OFF);
		java.util.logging.Logger.getLogger("org.apache.http").setLevel(java.util.logging.Level.OFF); 
		
		CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); 
		String URL ="http://www.loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil";
		
		WebClient webClient = new WebClient(BrowserVersion.getDefault());
		HtmlPage page = webClient.getPage(URL);
		webClient.getOptions().setJavaScriptEnabled(true);
		webClient.waitForBackgroundJavaScript(9000);
		System.out.println(page.getTitleText());
		System.out.println(page.getUrl().toString()); 
		
		List<HtmlElement> spans = page.getBody().getElementsByAttribute("span", "class", "ng-binding"); 
		HtmlSpan concurso = (HtmlSpan) spans.get(0); 
		
		String ccs = concurso.getTextContent().replaceAll("\\s+", " ").trim(); 
		System.out.println(ccs); 
		
		List<Long> resultados = new ArrayList(); List<HtmlElement> lista = page.getBody().getElementsByAttribute("table", "class", "simple-table lotofacil"); 
		HtmlTable tabela = (HtmlTable) lista.get(0); 
		
		List<HtmlTableCell> cells = tabela.getBodies().get(0).getElementsByAttribute("td", "ng-repeat", "dezena in resultadoLinha"); 
		cells.forEach(cell -> resultados.add(Long.parseLong(cell.getTextContent())));
		
		System.out.println(resultados);
	}
}
M

e como eu faria isso?

Lucas_Camara

Qual classe precisar acessar esse resultado? Como vc está chamando essa outra classe?

Lucas_Camara

Mude sua classe Loto para ficar assim:

public class Loto {

	public List<Long> recuperarResultados() throws IOException {
		java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(java.util.logging.Level.OFF);
		java.util.logging.Logger.getLogger("org.apache.http").setLevel(java.util.logging.Level.OFF); 
		
		CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); 
		String URL ="http://www.loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil";
		
		WebClient webClient = new WebClient(BrowserVersion.getDefault());
		HtmlPage page = webClient.getPage(URL);
		webClient.getOptions().setJavaScriptEnabled(true);
		webClient.waitForBackgroundJavaScript(9000);
		System.out.println(page.getTitleText());
		System.out.println(page.getUrl().toString()); 
		
		List<HtmlElement> spans = page.getBody().getElementsByAttribute("span", "class", "ng-binding"); 
		HtmlSpan concurso = (HtmlSpan) spans.get(0); 
		
		String ccs = concurso.getTextContent().replaceAll("\\s+", " ").trim(); 
		System.out.println(ccs); 
		
		List<Long> resultados = new ArrayList(); List<HtmlElement> lista = page.getBody().getElementsByAttribute("table", "class", "simple-table lotofacil"); 
		HtmlTable tabela = (HtmlTable) lista.get(0); 
		
		List<HtmlTableCell> cells = tabela.getBodies().get(0).getElementsByAttribute("td", "ng-repeat", "dezena in resultadoLinha"); 
		cells.forEach(cell -> resultados.add(Long.parseLong(cell.getTextContent())));
		
		return resultados;
	}
}

E faça a chamada dessa forma:

private List<Long> resultadoLoto;

// mais código (que não quis colocar nesse exemplo)

jButton1.addActionListener(new ActionListener() {
	@Override
	public void actionPerformed(ActionEvent ae) {
		Loto loto = new Loto();
		
		try {
			this.resultadoLoto = loto.recuperarResultados();
		} catch (IOException ex) {
			Logger.getLogger(Ltous.class.getName()).log(Level.SEVERE, null, ex);
		}
	}
});
M

Deu um erro aqui, "create field to “resultadoLoto”

Lucas_Camara

Onde vc colocou a propriedade “resultadoLoto” ? Posta a classe completa.

Lucas_Camara

E esse erro deu em qual linha?

M
nessa - >	this.resultadoLoto = loto.recuperarResultados();
Lucas_Camara

Essa linha de código está na classe Ltous?

M
sim,

try {

this.resultadoLoto = loto.recuperarResultados();

} catch (IOException ex) {
Lucas_Camara

Crie esse método na classe:

public static void setResultadoLoto(List<Long> resultadoLoto) {
	this.resultadoLoto = resultadoLoto;
}

E mude de:

this.resultadoLoto = loto.recuperarResultados();

para:

setResultadoLoto(loto.recuperarResultados());
M

no Ltous né?

Lucas_Camara

Sim. Pois é nessa classe que existe o atributo resultadoLoto.

M

Deu um novo erro agora kkk,

non-static variable this cannot be referenced from a static context
this.resultadoLoto = resultadoLoto;

public static void setResultadoLoto(List resultadoLoto) {

<strong>nessa linha</strong> ->	this.resultadoLoto = resultadoLoto;

}
Lucas_Camara

Vix mano, foi mal. Mandei o exemplo errado, tem que tirar essa palavra-chave: static .

M

Po cara, muito obrigado vei de verdade mas n ta indo não, desisto.

Lucas_Camara

Deu outro erro? Qual?

M

É pq no caso não ta comparando as duas arraylist

if (Lista.contains(resultadoLoto)) {
	legal.setText("Parabéns você é o ganhador!!!");
} else {
	legal.setText("Que pena, tenta na próxima...");
}
Lucas_Camara

Essa parte não pode ser assim não.

Como tem que ser a lógica? Todos os itens de Lista devem existir em resultadoLoto?

Lucas_Camara

Se a lógica for:

Todos os itens de Lista devem existir em resultadoLoto

Você pode tentar assim:

boolean ganhou = false;

for (Long numEscolhido : Lista) {
	if (!resultadoLoto.contains(numEscolhido)) {
		ganhou = false;
		break;
	}

	ganhou = true;
}

if (ganhou) {
	legal.setText("Parabéns você é o ganhador!!!");
} else {
	legal.setText("Que pena, tenta na próxima…");
}
M

A classe Loto é uma API que chama os resultados e armazena nessa arraylist e eu acho que o erro ta por ai.

Lucas_Camara

Pq vc acha isso? Essa chamada loto.recuperarResultados() está retornando algum resultado?

Vc usa github? Se sim e se vc quiser, vc pode jogar seu projeto lah que eu consigo te ajudar a fazer ele funcionar.

M

Como assim retornando algum resultado?

Lucas_Camara

Nessa parte:

jButton1.addActionListener(new ActionListener() {
	@Override
	public void actionPerformed(ActionEvent ae) {
		Loto loto = new Loto();
		
		try {
			this.resultadoLoto = loto.recuperarResultados();
		} catch (IOException ex) {
			Logger.getLogger(Ltous.class.getName()).log(Level.SEVERE, null, ex);
		}
	}
});

Você está instanciando a classe Loto (instanciar é usar o new) e chamando o método recuperarResultados, que foi feito para retornar uma lista de números (List<Long>). Ou seja, esse método pode retornar uma lista com números ou uma lista vazia.

Pela lógica desse método (recuperarResultados), ele está indo no site da caixa e capturando os numeros sorteados (que devem ser os números que deverão ser retornados). Se esses números não estiverem sendo retornados, vc deve ajustar o código que recupera os números do site da caixa.

M

Ahh sim, não ta retornando tipo eu coloco exatamente os mesmo valores da caixa e diz que não contem.

M

A API ta sendo feita eu acho que o negócio ta no armazenamento da arraylist.

M

Ta assim mesmo
public List recuperarResultados() throws IOException {

java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(java.util.logging.Level.OFF);
	java.util.logging.Logger.getLogger("org.apache.http").setLevel(java.util.logging.Level.OFF); 
	
	CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); 
	String URL ="http://www.loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil";
	
	WebClient webClient = new WebClient(BrowserVersion.getDefault());
	HtmlPage page = webClient.getPage(URL);
	webClient.getOptions().setJavaScriptEnabled(true);
	webClient.waitForBackgroundJavaScript(9000);
	System.out.println(page.getTitleText());
	System.out.println(page.getUrl().toString()); 
	
	List<HtmlElement> spans = page.getBody().getElementsByAttribute("span", "class", "ng-binding"); 
	HtmlSpan concurso = (HtmlSpan) spans.get(0); 
	
	String ccs = concurso.getTextContent().replaceAll("\\s+", " ").trim(); 
	System.out.println(ccs); 
	
	List<Long> resultados = new ArrayList(); 
            List<HtmlElement> lista = page.getBody().getElementsByAttribute("table", "class", "simple-table lotofacil"); 
	HtmlTable tabela = (HtmlTable) lista.get(0); 
	
	List<HtmlTableCell> cells = tabela.getBodies().get(0).getElementsByAttribute("td", "ng-repeat", "dezena in resultadoLinha"); 
	cells.forEach(cell -> resultados.add(Long.parseLong(cell.getTextContent())));
	
	return resultados;
}

}

Lucas_Camara

Testei esse código e estourou erro pra mim.

Lucas_Camara

Qual a versão do HtmlUnit que vc está usando?

Lucas_Camara

Consegui recuperar os números sorteados, mas não usei HtmlUnit e precisei utilizar as libs: httpclient e gson.

Consegui recuperar os números usando essa URL: http://www.loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil/!ut/p/a1/04_Sj9CPykssy0xPLMnMz0vMAfGjzOLNDH0MPAzcDbz8vTxNDRy9_Y2NQ13CDA0sTIEKIoEKnN0dPUzMfQwMDEwsjAw8XZw8XMwtfQ0MPM2I02-AAzgaENIfrh-FqsQ9wBmoxN_FydLAGAgNTKEK8DkRrACPGwpyQyMMMj0VAcySpRM!/dl5/d5/L2dBISEvZ0FBIS9nQSEh/pw/Z7_61L0H0G0J0VSC0AC4GLFAD2003/res/id=buscaResultado/c=cacheLevelPage/=/?timestampAjax=1585528134569

Se tu animar tentar, me chama que eu te passo o que fiz. Flws!

M

Cara eu não sei.

M

Necessariamente tinha que usar as lib que ele deu, mas muito obrigado cara.

Criado 28 de março de 2020
Ultima resposta 30 de mar. de 2020
Respostas 37
Participantes 2