在 For 循环增量中使用 if else

Posted

技术标签:

【中文标题】在 For 循环增量中使用 if else【英文标题】:Using if else in For Loop increment 【发布时间】:2016-01-29 18:01:46 【问题描述】:

我在 Java 中有一个问题:

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

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

for (int i=0; i < str.length(); if (i%4==0) i++, else i+=3)
    result += str.charAt(i);

我们可以这样做吗?

【问题讨论】:

这样的东西会混淆你的代码。你最好让赋值有条件,而不是 for 循环增量。 对于回答建议我将增量留空然后将if-else 放入循环正文但后来删除答案的人,我只想谢谢你;我以前从未想过。 是的,我知道它会使代码“丑陋”,我只是好奇一种构造某些东西的方法;即使它是不必要的。但是感谢大家的宝贵时间! 与其说是丑,不如说是可维护性和可读性。一段完美的代码会让你说“啊,我立即明白发生了什么。” 【参考方案1】:

你不能使用 if there 但你可以使用三元运算符

for (int i = 0; i < str.length(); i += i%4 == 0 ? 1 : 3) 
    result += str.charAt(i);

【讨论】:

能做不代表就应该做 递增表达式必须递增或递减循环控制变量值 - 所以它应该符合语言推荐。【参考方案2】:

简单地说,您需要从 0 开始的每 4th 个位置的两个字符。您可以使用以下代码:

StringBuilder builder = new StringBuilder();
for (int i = 0; i < safeLength; i += 4)
    builder.Append(str.substring(i, i + 2));

与您接受的答案不同,此答案中有:

没有混淆; 意图非常明确;而且, 最重要的是,没有if-else 或三元运算符。

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

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

int safeLength = str.Length();
bool lengthCorrectionWasNeeded = (str.length() - 1) % 4 == 0;
if (lengthCorrectionWasNeeded) safeLength--;

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

if (lengthCorrectionWasNeeded) builder.append(str.substring(str.length() - 2));

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

【讨论】:

您的 for 循环要好得多,但您的解决方案会为某些输入提供 StringIndexOutOfBoundsException @VBCPP:我没有将 cmets 留在这里,而是想更新答案。所以,你去吧。 谢谢,这几乎是我最初的解决方案,但没有StringBuilder。没见过,所以我认为如果我要大量修改单个字符串,我应该使用它? @micahwood50:是的,如果有很多基于字符串的加减法,你应该使用StringBuilder。您绝对应该阅读此Sad Tragedy 和Horses。【参考方案3】:

关于“在 For 循环增量中使用 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();

【讨论】:

+1 建议使用 StringBuilder。但是,在每次迭代中调用 str.length() 并不是性能问题。这个方法只返回底层char[] 的长度属性,它很可能是内联的。它不是在“计算”任何东西。

以上是关于在 For 循环增量中使用 if else的主要内容,如果未能解决你的问题,请参考以下文章

IF else 和 for 在一行中循环

JAVA里 FOR循环内 IF 与 ELSE的嵌套使用

在for循环中排除字典中的项目,并在字典中使用if和 else。

for循环中的if else语句

python基础5 if-else流程判断,for循环和while循环

绑定 CF for 循环和 if else 循环