2015-09-30 76 views
4

對於代碼質量的原因,我想稍微重構一下我的代碼,以便在我的循環中只使用一條break語句。但我不知道我可以做這SonarQube是亞慶我的方式...如何避免在循環中使用多個「break」語句?

這裏是我的代碼:

for (Integer integer: integerKey.keySet()) { 
    if (map.containsKey(integerKey.get(integer))) { 
     TypeValue value = map.get(integerKey.get(integer)); 
     sb.append(integerKey.get(integer)).append(":"); 
     sb.append(encodeValue(value)); 
     sb.append("|"); 
     if (integerKey.get(integer).equals(min)) { 
      break; 
     } 
    } else if (integerKey.get(integer) <= min){ 
     TypeValue value = map.get(min); 
     sb.append(min).append(":"); 
     sb.append(encodeValue(value)); 
     sb.append("|"); 
     break; 
    } else { 
     sb.append(integerKey.get(integer)).append(":"); 
     sb.append("0"); 
     sb.append("|"); 
    } 
} 

我願做同樣的事情,但只使用一個break但我不是當然,在這種情況下,我只能寫出一個if條件,而不是if-elseif-else

任何想法?

謝謝。

+0

備註:如果需要鍵和值,可以避免查找(Map.get),所以迭代entrySet效率更高。 – Puce

+0

附加註意事項:無論如何,'integerKey.get(integer)'可以被「緩存」,所以你不必每次迭代多次執行查找。最好的做法是使用入門套件,只需獲得入門的關鍵和價值,就像Puce已經說過的一樣。 – Thomas

回答

3

你可以定義一個變量的盈虧狀況,包括它進入for循環條件:

boolean endLoop = false; 
for (Iterator<Integer> keys = integerKey.keySet(); keys.hasNext() && !endLoop;) { 
    Integer integer = keys.next(); 
    if (map.containsKey(integerKey.get(integer))) { 
     ... 
     if (integerKey.get(integer).equals(min)) { 
      endLoop = true; 
     } 
    } else if (integerKey.get(integer) <= min){ 
     ... 
     endLoop = true; 
    } else { 
     ... 
    } 
} 

或聲明在循環中的局部變量被設置爲true,如果迴路應與左一休:

for (Integer integer: integerKey.keySet()) { 
    boolean endLoop = false; 
    if (map.containsKey(integerKey.get(integer))) { 
     ... 
     if (integerKey.get(integer).equals(min)) { 
      endLoop = true; 
     } 
    } else if (integerKey.get(integer) <= min){ 
     ... 
     endLoop = true; 
    } else { 
     ... 
    } 
    if (endloop) 
     break; 
} 
+0

哦,是的,我明白了,那太棒了。謝謝! – hacks4life

0

如果您只想使用一箇中斷,那麼您可以設置一個布爾變量並在循環結束時對其進行測試。

0

@ hacks4life,你選擇的答案肯定是你問了一個,但它不是一個你應該從一個角度「提高代碼的質量」點得到(畢竟,您確實將SonarQube標籤添加到了您的問題中,這意味着您對代碼質量感興趣)。

您的代碼片段或所選答案中的代碼都不易讀取也不易於維護。主要原因在於幾個代碼邏輯相互混合(又名Spaghetti_code)。

如果你可以從字符串連接邏輯中分離退出條件,那麼問題將是無關緊要的,你的代碼將更易於維護,並且既沒有多個break語句,也沒有可變控制流變量(都是代碼味道)。