内循环和外循环是否可以相继中断和恢复?
Can inner and outer loops interrupt and resume one after another?
我有一个现有循环,可以在两条水平线上绘制标签和文本框(第 1 行作为标签,第 2 行作为文本框)。当时的循环是基于明确要求每种类型的元素不会超过12个。这是使用两个循环编写的(一个循环代表标签,另一个代表文本框):
绘制标签
for (int i = 2, i<hdrlabel.length; i++){
coldef.add(new ColDefType("",hdrLabel[i],"varchar",false,15,"HDR"+String.valueOf(i),1,i==2?"%-25s":"",6,"LABEL",true,""));
}
绘制文本框
LinkedHashmap<String,String> row = dbVal.get(i)
for (int j = 1, i<hdrlabel.length-1; i++){
coldef.add(new ColDefType(j==1?row.get(hdrLabel[j]:"",row.get(hdrLabel[j+1],"decimal5",false,15,row.get(hdrLabel[0])+String.valueOf(j),i+2),j==1?"%-25s":"",6,"TXTFLD",true,""));
}
现在,考虑到天数,每个组件类型的元素数量(在 hdrLabel.length-2 中)现在增加到最多 31 个。由于移动设备和平板电脑查看的间距问题,我们确定每行最多绘制 12 个元素是最好的。我要找的是,如果每种类型的元素个数超过12个,应该画成这样:
- 第 1 行:标签 1-12
- 第 2 行:文本框 1-12
- 第 3 行:标签 13-24
- 第 4 行:文本框 13-24
- 第 5 行:标签 25-31
- 第 6 行:文本框 25-31
如果元素个数在15到24之间,则第5行和第6行的框和标签不需要绘制
有没有办法只使用两个循环,其中一个循环到达 12 / 24 元素时暂停一个循环,运行 另一个循环然后恢复前一个循环?
我找不到更精简的方法来做到这一点,因为我能得到的最接近的方法是将它分解为几个 for 循环,但如果给定最大元素的动态数量,它肯定效率不高:
- 第 1 行 -(对于 i=2、i<14、i++)- 在 13 处中断
- 第 2 行 -(对于 j=1,j<13,j++)- 在 12 处中断
- 第 3 行 -(对于 i=14、i<26、i++)- 在 26 处中断
- 第 4 行 -(对于 j=13,i<25,i++)- 在 25 处中断
- 第 5 行 -(对于 i=26,i
处中断
- 第 6 行 -(对于 j=25,i
处中断
不确定这是否是您想要的,因为它使用了 3 个循环,但至少它有效(假设您希望循环 1 始终先发生)
int i_start = 2;
int j_start = 1;
int i_terminate = 32;
int j_terminate = 32;
int next_i, next_j;
while (true) {
next_i = Math.min(i_start + 12, i_terminate);
next_j = Math.min(j_start + 12, j_terminate);
for (int i = i_start; i < next_i; ++i) {
// do something
}
for (int j = j_start; j < next_j; ++j) {
// do something
}
i_start = next_i;
j_start = next_j;
if (i_start == i_terminate && j_start == j_terminate) {
break;
}
}
我有一个现有循环,可以在两条水平线上绘制标签和文本框(第 1 行作为标签,第 2 行作为文本框)。当时的循环是基于明确要求每种类型的元素不会超过12个。这是使用两个循环编写的(一个循环代表标签,另一个代表文本框):
绘制标签
for (int i = 2, i<hdrlabel.length; i++){
coldef.add(new ColDefType("",hdrLabel[i],"varchar",false,15,"HDR"+String.valueOf(i),1,i==2?"%-25s":"",6,"LABEL",true,""));
}
绘制文本框
LinkedHashmap<String,String> row = dbVal.get(i)
for (int j = 1, i<hdrlabel.length-1; i++){
coldef.add(new ColDefType(j==1?row.get(hdrLabel[j]:"",row.get(hdrLabel[j+1],"decimal5",false,15,row.get(hdrLabel[0])+String.valueOf(j),i+2),j==1?"%-25s":"",6,"TXTFLD",true,""));
}
现在,考虑到天数,每个组件类型的元素数量(在 hdrLabel.length-2 中)现在增加到最多 31 个。由于移动设备和平板电脑查看的间距问题,我们确定每行最多绘制 12 个元素是最好的。我要找的是,如果每种类型的元素个数超过12个,应该画成这样:
- 第 1 行:标签 1-12
- 第 2 行:文本框 1-12
- 第 3 行:标签 13-24
- 第 4 行:文本框 13-24
- 第 5 行:标签 25-31
- 第 6 行:文本框 25-31
如果元素个数在15到24之间,则第5行和第6行的框和标签不需要绘制
有没有办法只使用两个循环,其中一个循环到达 12 / 24 元素时暂停一个循环,运行 另一个循环然后恢复前一个循环?
我找不到更精简的方法来做到这一点,因为我能得到的最接近的方法是将它分解为几个 for 循环,但如果给定最大元素的动态数量,它肯定效率不高:
- 第 1 行 -(对于 i=2、i<14、i++)- 在 13 处中断
- 第 2 行 -(对于 j=1,j<13,j++)- 在 12 处中断
- 第 3 行 -(对于 i=14、i<26、i++)- 在 26 处中断
- 第 4 行 -(对于 j=13,i<25,i++)- 在 25 处中断
- 第 5 行 -(对于 i=26,i
处中断 - 第 6 行 -(对于 j=25,i
处中断 - 第 6 行 -(对于 j=25,i
不确定这是否是您想要的,因为它使用了 3 个循环,但至少它有效(假设您希望循环 1 始终先发生)
int i_start = 2;
int j_start = 1;
int i_terminate = 32;
int j_terminate = 32;
int next_i, next_j;
while (true) {
next_i = Math.min(i_start + 12, i_terminate);
next_j = Math.min(j_start + 12, j_terminate);
for (int i = i_start; i < next_i; ++i) {
// do something
}
for (int j = j_start; j < next_j; ++j) {
// do something
}
i_start = next_i;
j_start = next_j;
if (i_start == i_terminate && j_start == j_terminate) {
break;
}
}