将常规for循环重构为增强的for循环

时间:2017-01-26 05:14:08

标签: java

我有一个常规 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 个答案:

答案 0 :(得分: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 :(得分:1)

另一种方法是转换为String并使用replace

    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);

<强>输出

  

一到二到三