Como trazer apenas alguns elementos de um arraylist?

10 respostas Resolvido
javaarraylistprogramação
W

Bom dia.
Estou com uma lista implementada que retorna N elementos.
Eu percorro a lista neste formato;

for (int x = 0; x < statusCorrigido.size(); x++) {
	for (int i = 0; i <= 4; i++) {
		if (i == 1) {
			statusCorrigido.get(i).setNome_sistema("SMS");
		} else if (i == 2) {
			statusCorrigido.get(i).setNome_sistema("ALAS");
		} else if (i == 3) {
			statusCorrigido.get(i).setNome_sistema("NATAS");
		} else if (i == 4) {
			statusCorrigido.get(i).setNome_sistema("PERF");
		}
		
		bw.newLine();
		
		bw.write(
			statusCorrigido.get(x).getLogin() + ";" + 
			statusCorrigido.get(x).getNome() + ";" + 
			statusCorrigido.get(x).getCpf() + ";" + 
			statusCorrigido.get(x).getData_desligamento() + ";" + 
			statusCorrigido.get(x).getNome_sistema() + ";" + 
			statusCorrigido.get(x).getData_gravacao() + ";" + 
			statusCorrigido.get(x).getStatus() + ";" + 
			statusCorrigido.get(x).getProtocolo() + ";" + 
			statusCorrigido.get(x).getData_processado()
		);
	}
}

O problema é que o resultado obtido é a lista inteira dos objetos como no exemplo.

Login	Sistema	Data/Hora Gravação	Status por base	Protocolo	Processado	
Z014190	SALES	2021-04-05 11:11:06.0	SUCESSO	null	2021-04-05 13:37:04.0	
Z014190	SALES	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 13:37:04.0	
Z014190	SALES	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 13:37:04.0	
Z014190	SALES	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 13:37:04.0	
Z014190	SALES	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 13:37:04.0	
Z014190	SMS	2021-04-05 11:11:06.0	SUCESSO	null	2021-04-05 11:49:37.0	
Z014190	SMS	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 11:49:37.0	
Z014190	SMS	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 11:49:37.0	
Z014190	SMS	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 11:49:37.0	
Z014190	SMS	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 11:49:37.0	
Z014190	ATAS	2021-04-05 11:11:06.0	SUCESSO	null	2021-04-05 11:30:45.0	
Z014190	ATAS	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 11:30:45.0	
Z014190	ATAS	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 11:30:45.0	
Z014190	ATAS	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 11:30:45.0	
Z014190	ATAS	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 11:30:45.0	
Z014190	NATAS	2021-04-05 11:11:06.0	SUCESSO	null	2021-04-05 11:27:11.0	
Z014190	NATAS	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 11:27:11.0	
Z014190	NATAS	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 11:27:11.0	
Z014190	NATAS	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 11:27:11.0	
Z014190	NATAS	2021-04-05 11:11:06.0	NAO CADASTRADO	null	2021-04-05 11:27:11.0	
Z014190	PERF	2021-04-05 11:11:06.0	SUCESSO	null	2021-04-05 11:49:36.0

Quando na verdade eu gostaria de apenas os 5 primeiro resultados de cada objeto por exemplo.

Login Sistema Data/Hora Gravação Status por base Protocolo Processado
Z192671 SALES 2021-03-29 10:14:10.0 AGUARDANDO null null
Z192671 SMS 2021-03-29 10:14:11.0 AGUARDANDO null 2021-03-29 15:14:55.0
Z192671 ATAS 2021-03-29 10:14:11.0 AGUARDANDO null null
Z192671 NATAS 2021-03-29 10:14:11.0 AGUARDANDO null null
Z192671 PERF 2021-03-29 10:14:11.0 AGUARDANDO null null

Sendo assim para cada objeto da lista.

10 Respostas

S

Pelo amor de deus, a cada iteração você está chamando 10 vezes o método statusCorrigido.get.
Chama uma vez só utilizando uma variável local.

R

Só 5 primeiros elementos?
Use uma contagem no seu for.
Exemplo:

int count = 1;
for () {
    if (count == 6) {
        break;
    }
    count++;
}

Dá pra fazer com a API Stream também, método limit().

Edit: você já tem a variável x, use ela.

L

Não entendi muito bem qual a lógica por trás de statusCorrigido.get(i) e statusCorrigido.get(x), mas penso que o bw.write talvez deva ficar fora do for interno. Com isso, a linha não será escrita 4 vezes para cada iteração do for externo.

W

Nesse caso, o statusCorrigido não é um método, mas sim a minha Lista.

@RoinujNosde
Sim, eu entendi o conceito, mas tem que ser para cada objeto diferente da minha lista, ou seja leio os 5 primeiros, ignoro o restante até o objeto ser diferente e ai leio novamente.
Exemplo

Nessa Lista

[ z1234,z1234,z1234,z1234,z1234 ,z1234,z1234,z1234,z1234, z54321,z54321,z54321,z54321,z54321 ,z54321,z54321]

minha necessidade é pegar os 5 primeiro casos do z1234, depois os 5 primeiros casos do z54321.

@Lucas_Camara

Neste formato, ele iria colocar os novos status apenas nas 5 primeiras linhas, quando na verdade eu tenho que colocar em todas linhas de cada objeto novo, conforme descrevi ao amigo acima.

G

Faça uma variável fora do for para que possa armazenar a ultima coisa lida no loop e faça uma verificação com a próxima, se forem iguais continua o processo, se não for para.
Se for isso que eu entendi…

W

Desculpa, não compreendi.
Seria fazer tipo

String UltimoValor = statusCorrigido.get(i).getLogin().toString(); 

if(UltimoValor == statusCorridigo.get(i+1).getLogin()) {}

essa a ideia?

G

Exatamente, assim então você poderá comparar o último valor como o valor atual e saber se são iguais ou diferentes. E a cada loop você deve atualizar essa variável ultimoValor

Lembre-se de declarar a variável fora do for e dps atualiza-la dentro do for.

W

Entendi a ideia, mas ainda não esta dando o resultado esperado, na verdade quando faço essa comparação ele da erro de index na listagem.

String ultimoValor = null;
		String nextPos = null;
		
		for (int i = 0; i <= 4; i++) {
			if (i == 1) {
				statusCorrigido.get(i).setNome_sistema("SMS");
			} else if (i == 2) {

				statusCorrigido.get(i).setNome_sistema("ATAS");
			} else if (i == 3) {
				statusCorrigido.get(i).setNome_sistema("NATAS");
			} else if (i == 4) {
				statusCorrigido.get(i).setNome_sistema("PERF");
			}

			for (int x = 0; x < statusCorrigido.size(); x++) {
				nextPos = statusCorrigido.get(x + 1).getLogin().toString();
				ultimoValor = statusCorrigido.get(x).getLogin().toString();					
				if (ultimoValor.equals(nextPos)) {
					bw.newLine();
					bw.write(statusCorrigido.get(x).getLogin() + ";" + statusCorrigido.get(x).getNome() + ";"
							+ statusCorrigido.get(x).getCpf() + ";" + statusCorrigido.get(x).getData_desligamento()
							+ ";" + statusCorrigido.get(x).getNome_sistema() + ";"
							+ statusCorrigido.get(x).getData_gravacao() + ";" + statusCorrigido.get(x).getStatus()
							+ ";" + statusCorrigido.get(x).getProtocolo() + ";"
							+ statusCorrigido.get(x).getData_processado());
				}
			}
		}
G
Solucao aceita

No caso meu amigo a nextPos não é a posição +1 é a posição atual (acho que expressei mal quando falei proxima posição), por isso que acho que está dando erro de index.
Tira esse +1 no nextPos

W

Compreendi.
Obrigado.

Criado 13 de abril de 2021
Ultima resposta 13 de abr. de 2021
Respostas 10
Participantes 5