Percorrer array de 3 em 3

Boa noite.
Tenho um ArrayList com 30 elementos e gostaria de varrer esse array de três em três.
Exemplo: Leio os primeiros 3 elementos na primeira execução do laço (em cima desses 3 farei uma execução que preciso),leio os 3 próximos elementos na segunda execução do laço e assim por diante até chegar aos 30.
Não sei se seria interessante ir limpando a lista cada vez que leio os 3 elementos corrente!
Se alguém puder me ajudar agradeço!

PS: Meu array tem muito mais que 30, coloquei esse valor só pra ficar mais fácil de entender.

O tamanho final será sempre múltiplo de 3? Ex: 30, 33, 36, 48, 120, 300.

Se sim, basta fazer um for incrementando de 3 em 3. Algo assim:

int total = arrayListComDados.size();

for( int i = 0; i < total; i+=3){ // note o += 3
  ElementoDoArray elemento1 = arrayListComDados(i); // vai acessar o elemento na posição i (ex: 0, 3, 6 )
  ElementoDoArray elemento2 = arrayListComDados(i+1); // vai acessar o elemento na posição i + 1 (ex: 1, 4, 7)
  ElementoDoArray elemento3 = arrayListComDados(i+2); // vai acessar o elemento na posição i + 2 (ex: 2, 5, 8)
  // aqui você faz o que quiser com as variáveis elemento1, elemento2 e elemento3
}

Abraço.

Opah, não será TerraSkilll, o tamanho é variável! Ai tenho pego muito “array of bound exception”;
obrigado pela força.

E o que você faz quando sobram 1 ou 2 elementos? Ex: 7, 8, 13, 95 elementos? O que deve acontecer nesse caso?

Abraço.

1 curtida

Como o TerraSkill comentou existe um problema em percorrer 3 em 3 quando a quantidade da lista seja variavel, seria interessante validar essa opcao, por exemplo ir percorrendo a lista 3 em 3 , mas caso a array por algum motivo tenho menos que tres elementos ele passe a percorrer 1 em 1.

igoralves - é mais realmente pra mim seria de 3 em 3 registros!
Estava estudando sobre como implementar um Iterator, talvez acho que so assim eu resolvo essa minha necessidade, mas ta tresh!
Valews

Você ainda não explicou o que acontece se a quantidade de registros não for múltipla de 3, o que dificulta sugerir outras opções. Ou a lista inteira só é processada caso o total de elementos seja múltiplo de 3, e é preciso garantir isso antes de iniciar o processamento?

Ex: se tem 4 elementos, os elementos 1, 2 e 3 serão processados em conjunto. Mas o que acontece com o elemento 4? Ele é processado sozinho? Ou não é processado? É preciso emitir alguma mensagem pro usuários? Ou são criados elementos “vazios” (5 e 6) para serem processados junto com o 4?

Cada uma dessas opções leva a respostas diferentes, então explique o que precisa acontecer nesse caso.

Abraço.

É assim, eu estou consultando um webservice que me da 1 consulta a cada minuto, sendo que nessa consulta eu posso pesquisar até 3 registros, criei um task pra isso! Starta o método a cada 1:10 pra não ter erro.
Porém, se eu fizer 3 por minuto eu vou demorar 22:33hrs pra atualizar todos os meus cadastros, se eu fizer 1 por minuto ( facilita pra mim ) vou demorar quase 3 dias.

Então em tenho uma lista e quero ir consultando de 3 em 3, se possível eu ate removo esse Clientes depois de consultados.

Respondendo sua pergunta, caso fossem 4 elementos o quarto seria processado sozinho.

Bom, então, primeiramente, você precisa garantir que a sua função que faz a consulta é capaz de operar com 2 ou 1 elemento, passando parâmetros vazios ou nulos para as posições não preenchidas.

Supondo que você já fez isso, é só o caso de verificar, no seu laço, se a posição a ser passada para a função existe ou não. Algo assim:

for( int i = 0; i < total; i+=3){ // note o += 3
  ElementoDoArray elemento1 = arrayListComDados(i); 
  ElementoDoArray elemento2 = null;
  ElementoDoArray elemento3 = null;
  if (i + 1 < total) {
    ElementoDoArray elemento2 = arrayListComDados(i+1);   
  }
  if (i + 2 < total) {
    ElementoDoArray elemento3 = arrayListComDados(i+2); 
  }
  metodoQueFazAConsulta(elemento1, elemento2, elemento3);
}

private void metodoQueFazAConsulta(ElementoDoArray e1, ElementoDoArray e2, ElementoDoArray e3){
  // antes de fazer a consulta, você verifica se os parâmetros são nulos
}

Obviamente, podem ser feitas otimizações, como passar uma lista para o método de consulta. Mas acho que dá pra entender a ideia.

PS: fiz o código de cabeça, podem ser necessários alguns ajustes.

Abraço.

Obrigado pela força pessoal! Não consegui fazer da forma que gostaria, mas tive outra ideia aqui via banco e ta indo de 3 em 3 :roll_eyes:.
abs