2017-01-26 135 views
0

我有一個常規for循環,幫助我通過利用普通for循環提供的索引定位來追加字符。重構一個常規for循環到一個增強for循環

我想重構循環並將其變爲for each循環,但缺點是索引定位。我無法找到一個方法來表明我想要追加我的字符​​。在這種情況下甚至可以使用for each循環?

來自:

for (int i = 0; i < itinerary.size(); i++) { 
    sb.append(itinerary.get(i).toUpperCase()); 
    if (i < itinerary.size() -1) { 
     sb.append(" to "); 
    } 
} 

for (String itineray : itinerary){ 
    sb.append(itineray.toUpperCase()); 
    if (//size of the array - 1){ 
     sb.append(" to "); 
    } 
} 
+2

你是否需要一個關於for-loops的問題的實際答案,或者你只是想知道更好的編寫代碼的方法,即使用[StringJoiner](https://docs.oracle)。 COM/JavaSE的/ 8 /文檔/ API/JAVA/util的/ StringJoiner.html)? –

+0

StringJoiner它是一個不同的類,即時通訊使用StringBuilder。 – mrKapplan

+2

我知道你在你的問題中使用了'StringBuilder',但是你可以直接寫'iternary.stream()。collect(Collectors.joining(「to」))'並完全避免for循環。 –

回答

4

一個辦法是遍歷不包括最後一個元件的原始列表的子集。然後再做一個追加。

for (String itineray : itinerary.subList(0, itinerary.size()-1)) { 
    sb.append(itineray.toUpperCase()); 
    sb.append(" to "); 
} 

sb.append(itinerary.get(itinerary.size()-1).toUpperCase()); 

注意,從性能上來看,這應該表現類似於使用一個明確的for循環。唯一的區別是列表的初始子集,但在此之後,增強的循環可以運行而不執行任何索引檢查。任何情況下,循環之外的最終追加都必須發生。

但作爲@RayToal指出的那樣,你可以用這一點,並完全避免的邊界條件問題:

itinerary.stream().collect(Collectors.joining(" to ")) 
1

另一種方法是轉換爲字符串,並使用替代

ArrayList<String> list = new ArrayList<>(); 
    list.add ("one"); 
    list.add ("two"); 
    list.add ("three"); 

    String output = list.toString(); 
    output = output.replace("[", "").replace("]", "").replace(",", " to"); 
    System.out.println(output); 

輸出

一至二至三

+0

字符串元素可能包含一個逗號。 –

+0

@RayToal不在我的代碼;-)也可能包含單詞'to'哪個woulc真的讓事情混淆 –

+0

我確定OP正在尋找一個_general_解決方案來解決這個問題。是的,如果列表中只包含帶括號和逗號的字符串,那麼用三個替換字符的表達式將起作用,但這種方法會導致巨大的安全問題。這是SQL注入和各種攻擊背後的思想。但是關於''到''的好點!這是絕對正確的!不知道如何解決_that_之一。 :) –