Java:跳过嵌套循环

时间:2015-02-21 17:45:29

标签: java loops nested

我知道我可以通过这种方式从内到外跳过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
          }
      }
   }
}

3 个答案:

答案 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;
            }
       }
   }
}