我知道我可以通过这种方式从内到外跳过java中的循环:
loop1:
for (Object o : objects1){
loop2:
for (Object o : objects2){
if (o.getSomething()) continue loop1 ;
}
}
但是我怎么能走另一条路,那就是从外面检查是否有循环执行:
loop1:
for (Object o : objects1){
if (condition) continue loop3;
loop2:
for (Object o : objects2){
loop3:
for (Object o : objects2){
}
}
}
if(condition)continue loop3;显然不会有效,但你明白了。
为什么我要这样做? 我用很多嵌套循环检查每个项目组合。在循环内创建条件。基于这些条件并不总是所有成功循环都是必要的,因此跳过它们会大大提高性能。
有什么想法吗?
试图更清楚:
ItemSet<Item> set = new ItemSet<>();
for (Item a : itemtype1){
for (Item b: itemtype2){
set.add(a);
set.add(b);
if (set.getX() == 1) "execute from loop1 on"
if (set.getX() == 2) "execute from loop2 on"
loop1:
for (Item c : itemtype3){
loop2:
for (Item d : itemtype4){
//execute final code here - this must be reached in any case
}
}
}
}
答案 0 :(得分:1)
使loop3成为一个方法,并在需要时调用它,例如:
void optimizedFunction(){
loop1:
for (Object o : objects1){
if (condition) { loop3(objects2); continue;}
loop2:
for (Object o : objects2){
loop3(objects2)
}
}
}
void loop3(List objects2){
for (Object o : objects2){
}
}
答案 1 :(得分:0)
你的问题没有多大意义。继续/休息可以解决您的问题,也可以解决问题。目前还不清楚你真正想做什么。
使用while循环或显式for循环可以准确控制发生的事情, 例如,如果您在内部循环中找到了一个对象,那么您唯一感兴趣的就是这样:
int iMin = 0;
int jMin = 0;
int iMax = object1.size();
int jMax = object2.size();
for(int i = iMin; i < iMax; i++) {
for(int j = jMin; j < jMax; j++) {
if(object1.get(i).someComparison(object2.get(j))) {
jMin = i;
jMax = i+1;
break; //this will break the inner loop and continue the outer one
}
}
}
另一方面,你总是可以访问在内部范围内声明的条件,因此你没有理由想要继续使用你想要继续的循环。
答案 2 :(得分:-1)
如果您的问题是在内部循环中设置某些条件不允许外部循环看到它,您可以在所有循环外定义条件,使其对所有循环都是全局的。
如果没有,请说明您想要达到的目标。
boolean condition;
loop1:
for (Object o : objects1){
if (condition) continue loop3;
loop2:
for (Object o : objects2){
loop3:
for (Object o : objects2){
if (something_trivial()){
condition = false;
continue loop1;
}
}
}
}