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.