在For循环增量中使用if else

gee*_*y42 15 java for-loop if-statement increment

我在Java中有一个问题:

给定一个字符串,返回由索引0,1,4,5,8,9处的字符组成的字符串...

我知道如何解决它,但是我想知道我是否可以使用if-elsefor循环增量本身,例如:

for (int i=0; i < str.length(); if (i%4==0) i++, else i+=3){
    result += str.charAt(i);
}
Run Code Online (Sandbox Code Playgroud)

我们可以这样做吗?

Man*_*dis 33

您不能使用if,但可以使用三元运算符

for (int i = 0; i < str.length(); i += i%4 == 0 ? 1 : 3) {
    result += str.charAt(i);
}
Run Code Online (Sandbox Code Playgroud)

  • 仅仅因为它可以完成并不意味着它应该被完成 (36认同)

dis*_*ame 9

简单地说,您希望从0开始每隔4 位置使用两个字符.您可以使用以下代码:

StringBuilder builder = new StringBuilder();
for (int i = 0; i < safeLength; i += 4){
    builder.Append(str.substring(i, i + 2));
}
Run Code Online (Sandbox Code Playgroud)

与您接受的答案不同,在这个答案中有:

  • 没有混淆;
  • 意图非常明确; 和,
  • 最重要的是,没有if-else或三元运营商.

更新:我知道可能性,IndexOutOfBoundsException但因为我只想关注核心逻辑,我没有添加该检查.以下是需要添加的代码以避免异常情况:

将以下代码放在for循环上方:

int safeLength = str.Length();
bool lengthCorrectionWasNeeded = (str.length() - 1) % 4 == 0;
if (lengthCorrectionWasNeeded) safeLength--;
Run Code Online (Sandbox Code Playgroud)

将以下代码放在for循环下面:

if (lengthCorrectionWasNeeded) builder.append(str.substring(str.length() - 2));
Run Code Online (Sandbox Code Playgroud)

最后builder.ToString()将包含所需的字符串.

  • 你的for循环要好得多,但你的解决方案会为某些输入提供StringIndexOutOfBoundsException (2认同)

小智 8

至于"在For Loop增量中使用if else"的问题,我同意Manos的回答.以下是我的一些建议.在我看来,重要的是代码清晰干净.并且这是一个很好的做法,提取str.length()到局部变量而不是在每个循环中"计算"它.如果你通过附加大量时间来构建一个字符串,那么StringBuilder是一个不错的选择.

    String str = "this is your string ...";
    int length = str.length();
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < length ; i += (i%4 == 0 ? 1 : 3)){
       builder.append(str.charAt(i));
    }
    String result = builder.toString();
Run Code Online (Sandbox Code Playgroud)

  • +1表示使用StringBuilder的建议.但是,在每次迭代时调用`str.length()`不是性能问题.这个方法只返回底层`char []`的length属性,很可能是内联的.它不是"计算"任何东西. (3认同)