【问题标题】:Why can I not use math (subtraction) in a for-loop condition?为什么我不能在 for 循环条件中使用数学(减法)?
【发布时间】:2018-06-06 11:04:32
【问题描述】:

我有两个字符串列表,listAlistBlistA 更长,我想通过向其添加空字符串来使 listB 具有相同的大小。

这行得通:

int diff = listA.size() - listB.size()
for (int i = 0; i < diff; i++) {
    listB.add("");
}

但这不是:

for (int i = 0; i < (listA.size() - listB.size()); i++) {
    listB.add("");
}

为什么会这样?

【问题讨论】:

  • 因为你要改变listB的大小
  • 在第一种情况下,diff 在你进入循环之前计算一次,它的值保持不变。在第二种情况下,(listA.size() - listB.size()) 在每次迭代时都会重新计算。

标签: java for-loop conditional-statements


【解决方案1】:

其他答案已经解释了为什么您的第二个循环不起作用。

我想建议一种替代方法,通过使用 Collections.nCopiesList.addAll 来消除循环:

if (listA.size() - listB.size() > 0) {
    listB.addAll(Collections.nCopies(listA.size() - listB.size(), ""));
}

int diff = listA.size() - listB.size();
if (diff > 0) {
    listB.addAll(Collections.nCopies(diff, ""));
}

【讨论】:

    【解决方案2】:

    每次调用list.add("")时List的大小都会增加

    所有(listB.size()-listB.size())通过迭代的所有内容都是计算列表的新大小 一世。 e listB 得到一个新的大小。

    从你的 sn-p diff == 你想要添加到 listB 的剩余项目的大小

    选项 1 可以。

    【讨论】:

      【解决方案3】:

      当您向 listB 添加新值时,大小将增加,因此在每个循环中,您的 for 循环重新评估 listB 的大小以查找条件是否为 false 以停止循环。在这种情况下,条件将永远是true,因为您将新元素添加到列表中

      【讨论】:

        【解决方案4】:

        第一个示例变量 diffconstant 而第二个示例在循环的每次迭代中都会评估条件,因此由于您在迭代期间添加对象,因此列表的大小将因此改变为什么两个代码 sn-ps 不做同样的事情。

        我建议您继续使用第一种方法,即预先缓存循环条件的限制,而不是在每次迭代期间重新评估它。

        【讨论】:

        • 最好只有一个while (listA.size() &gt; listB.size()) 循环,因为它的意图更清楚。
        猜你喜欢
        • 1970-01-01
        • 2019-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多