嵌套循环一次只能访问 X 个元素

Nested loop only access X elements at once

我需要访问列表的所有元素,但一次最多只能访问 10 个元素。为此,我想到了这样的嵌套循环:

for (int i = 0; i < 50 / 10; i++) {
    for (int k = 0; k < 10; k++) {
        paramList.addParam(xyz)
    }
    sendRequest(paramList);
}

通过这个嵌套循环,我可以访问 0-49 的所有元素,并且只能访问内循环中的 10 个元素。当列表只有 49 个元素而不是 50 个时,我的问题就出现了。然后我用这个逻辑最多只能得到 39 个元素。我最好的想法也是只访问例如最后一次迭代中的 5 个元素(列表大小 = 45)是为了在循环继续之前打破循环。

所以我的问题是,如何访问 List 中所有大小未定义的元素,但内循环中最多只能有 10 个元素(如果列表大小不允许 10,则更少) ?

作为一个选项,您可以使用 10 个元素的步骤在外循环中迭代:

int step = 10;
for (int i = 0; i < list.size(); i+=step) {
    for (int k = i; k < i + step && k < list.size()); k++) {
        System.out.println(list.get(k));
    }
}

如 user7 所说,您可以在嵌套循环中添加条件

for (int i = 0; i < list.size(); i+=10) {
    for (int k = i; k < list.size() && (k-i) < 10; k++) {
        System.out.println(k);
    }
}

我必须找到满足您需求的原因,用内部循环中断迭代,就像您的代码片段没有做任何有用的事情,它仍然在迭代列表。

我看到您需要逻辑的唯一原因是,如果您想在 10 个元素之后调用一个方法,例如:

for (int i = 0; i < 50 / 10; i++) {
    for (int k = 0; k < 10; k++) {
        System.out.println((i * 10) + k);
    }
    System.out.println("####");
}

这很有意义,但是不需要第二个循环,并且还提供了一个 "complex" 代码来理解。

作为替代方法,您可以正常迭代一个列表并添加一个条件来执行该方法。它提供了更具可读性的代码

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));

    if( (i + 1)%10 == 0){ //add one to not trigger this on the first iteration
        System.out.println("####");
    }
}

来自您的评论:

I retrieve up to 50 records from my database. For each record I need to create a request which will be send in a POST request. Each POST request can contain 10 data requests and I can only send 5 of those request per minute (5*10=50). Since I always fetch TOP 50 data from my database, it can happen that I only get 35 entries instead of 50. To create my requests, I need that data from my database and therefore I have to iterate the whole list, but only ever 10 elements in 1 go to create 1 full POST request

我可以看到这里的需求,假设您有一个实例 post,它有两个方法 addParamsendRequest。您需要迭代列表以发送 String 参数:

int i = 0; 
for(String s : params){
    post.addParam(s);
    if( ++i % 10 == 0){
         post.sendRequest();
    }
}
//If the last `addParam` was not sended, we check again.
if( i % 10 != 0){
     post.sendRequest();
}

注意循环外的条件变化