2010-11-18 77 views
7

嗨 我在初學java和我的程序有4個用於循環: 我的計劃是這樣的,如果btrue,元素將從pointList刪除,nn--和我想從全力以赴for循環,並再次從第一個循環,所以ll++,我該怎麼做?用break語句?我們怎樣才能從4內循環出去?

for (int l = 0; l < n; l++) { 
    for (int i = 1; i < (n - 2); i++) { 
     for (int j = i + 1; j < (n - 1); j++) { 
      for (int k = j + 1; k < n; k++) { 
       if (l != i && l != j && l != k) { 
        boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k)); 
        System.out.println(b); 
        if (b == true) { 
         pointList.remove(pointList.get(l); 
         n--; 
         break; 
        } 
        else 
         System.out.println(b); 
       } 
      } 
     } 
    } 
} 
+0

重複http:// stackoverflow。com/questions/551578/how-to-break-multiple-foreach-loop – SunnyShah 2010-11-18 11:02:04

+0

也許你可以用幾句話來形容你想做什麼? 「如果b爲真,則刪除第l項」。您的代碼包含語法錯誤。修復它,請澄清你的問題。 – khachik 2010-11-18 11:02:48

+0

它看起來像你試圖找到4個符合某些標準的元素。如果你解釋了標準是什麼,也許我們可以建議一個更簡單的方法來做同樣的事情。例如也許先排序列表可能會簡化循環。 OMG! – 2010-11-18 11:04:47

回答

17

您可以使用標記的突破爲:

 for (int l = 0; l < n; l++) { 
foo: for (int i = 1; i < (n - 2); i++) { 
      for (int j = i + 1; j < (n - 1); j++) { 
       for (int k = j + 1; k < n; k++) { 
        if (l != i && l != j && l != k) { 
         boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k)); 
         System.out.println(b); 
         if (b == true) { 
          pointList.remove(pointList.get(l); 
          n--; 
          break foo; 
         } 
         else 
          System.out.println(b); 
        } 

       } 

      } 
     } 
    } 
+0

這是一個變相的轉向,對吧? :) – lorenzog 2010-11-18 11:01:55

+0

它只會打破最後三個循環,然後它將從第一個循環開始,並進入這三個循環? – user472221 2010-11-18 11:13:36

+1

我想你可以認爲任何分支語句都是一個「喬裝打扮」。但他們都有他們的限制和他們的用途。甚至goto本身也確實(狀態機是沒有它的PITA)。 – 2010-11-18 11:17:48

3
String valueFromObj2 = null; 
String valueFromObj4 = null; 
OUTERMOST: for(Object1 object1: objects){ 
    for(Object2 object2: object1){ 
    //I get some value from object2 
    valueFromObj2 = object2.getSomeValue(); 
    for(Object3 object3 : object2){ 
     for(Object4 object4: object3){ 
     //Finally I get some value from Object4. 
     valueFromObj4 = object4.getSomeValue(); 
     //Compare with valueFromObj2 to decide either to break all the foreach loop 
     if(compareTwoVariable(valueFromObj2, valueFromObj4)) { 
      break OUTERMOST; 
     } 
     }//fourth loop ends here 
    }//third loop ends here 
    }//second loop ends here 
}//first loop ends here 
+0

取自http://stackoverflow.com/questions/551578/how-to-break-multiple-foreach-loop – SunnyShah 2010-11-18 11:02:59

0

第一'快速和骯髒'的解決方案是使用stay_into_loops變量並修改for個循環,如:

boolean stay_into_loops = true 
// here goes the first for loop 
for (int i = 1; i < (n - 2) && stay_into_loops ; i++) { 
      for (int j = i + 1; j < (n - 1) && stay_into_loops ; j++) { 
       for (int k = j + 1; k < n && stay_into_loops ; k++) { 
        if (l != i && l != j && l != k) { 
         boolean b = isOK(pointList.get(l), `pointList.get(i), pointList.get(j), pointList.get(k));` 
         System.out.println(b); 
         if (b == true) { 
          pointList.remove(pointList.get(l); 
          n--; 
          stay_into_loops = false; 
          break; 

但是,當你遇到像這樣的事情時,它通常是一種代碼味道。考慮重構代碼,因爲這會在某些時候升級爲混亂。

5

在循環中,break語句終止內循環,而continue跳到下一次迭代。爲了讓這兩個語句在不同的循環中工作,您需要使用labels。像這樣的東西應該工作:

outerloop:  
     for (int l = 0; l < n; l++) { 
      for (int i = 1; i < (n - 2); i++) { 
       for (int j = i + 1; j < (n - 1); j++) { 
        for (int k = j + 1; k < n; k++) { 
         if (l != i && l != j && l != k) { 
          boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k)); 
          System.out.println(b); 
          if (b == true) { 
           pointList.remove(pointList.get(l); 
           n--; 
           continue outerloop; 
          } 
          else 
           System.out.println(b); 
         } 

        } 

       } 
      } 
     } 
+0

完美,因爲它得到。謝謝你 – 2014-09-24 10:05:10

2

使用標籤的循環

for (int l = 0; l < n; l++) { 
    loopa: 
    for (int i = 1; i < (n - 2); i++) { 
     for (int j = i + 1; j < (n - 1); j++) { 
      for (int k = j + 1; k < n; k++) { 
       if (l != i && l != j && l != k) { 
        boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k)); 
        System.out.println(b); 
        if (b == true) { 
         pointList.remove(pointList.get(l); 
         n--; 
         break loopa; 
        } 
        else 
         System.out.println(b); 
       } 

      } 

     } 
    } 
} 

,然後從標籤的循環

+0

它只會打破最後三個循環,然後它會從第一個循環開始,並進入這三個循環呢? – user472221 2010-11-18 11:13:05

+0

在功能上與Brain相同。在這將啓動到最外層循環的下一個迭代 – stjohnroe 2010-11-18 14:01:12

0

打破每個內部for循環中爲自己創建一個出口。
這是一個快速和無痛的解決方案。

bool breakout; 
    for (int l = 0; l < n; l++) 
    { 
     breakout = false; 
     for (int i = 1; i < (n - 2) && !breakout; i++) 
      for (int j = i + 1; j < (n - 1) && !breakout; j++) 
       for (int k = j + 1; k < n && !breakout; k++) 
       { 
        if(b == true) 
         breakout = true;        
       } 
    } 

所以你看到的breakout布爾是您的機票出每個內環的,怎麼把它在每一個for聲明被檢查。 每次迭代第一個for時它都會重置。

1
again: 
for (int l = 0; l < n; l++) { 
     for (int i = 1; i < (n - 2); i++) { 
      for (int j = i + 1; j < (n - 1); j++) { 
       for (int k = j + 1; k < n; k++) { 
        if (l != i && l != j && l != k) { 
         boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k)); 
         System.out.println(b); 
         if (b == true) { 
          pointList.remove(pointList.get(l); 
          n--; 
          break again; 
         } 
         else 
          System.out.println(b); 
        } 

       } 

      } 
     } 
    } 
+0

我想他想繼續'for(int l ...'循環並且不會突破它... – 2010-11-18 11:55:25

1

我同意所有其他答案。不過,我想指出的是,exit的替代方案只是將該代碼放入其自己的例程中,並使用return語句打破整個事情。無論如何,你的四元嵌套循環本身就非常複雜,所以它可能應該在自己的例程中。

我曾參與DoD作業,要求cyclomatic complexity對於任何一個例程都不超過6(有一些例外)。如果你找不到一個更簡單的方法來做到這一點,你真的應該把它們放在自己的例程中,以保持那些不得不維護這些代碼的可憐schmucks的完整性。