【问题标题】:How to change from for to foreach in this case?在这种情况下如何从 for 更改为 foreach ?
【发布时间】:2015-11-10 05:40:19
【问题描述】:

在我的 Android 应用程序中,我有类似 C 的简单“for 循环”,如下所示:

for (int i = 0; i < max_count; i++) {
  // I must use the value of 'i' in the for loop body

}

但是 Android 工作室给了我一个 Lint 警告,建议将 for 循环更改为 foreach 循环。

你能告诉我如何切换到 foreach 循环并在循环体中使用 'i' 变量吗?

【问题讨论】:

  • 你不能,你必须维护一个单独的计数器。
  • 只是一个警告,你可以supress it
  • 您必须在循环外保留一个单独的计数器,并在循环内递增。
  • 我不会担心warning...
  • 好的,谢谢cmets,我会去压制它。

标签: java android for-loop foreach


【解决方案1】:

foreach 构造不适用于 int。

foreach 仅适用于数组和集合。

您可以使用替代方法:

int max = 5;
int[] arr = new int[max];

for (int i : arr) {

}

Docs

增强的 for 循环是 Java SE 平台 5.0 版中引入的一项流行功能。它的简单结构允许人们通过呈现访问数组/集合的每个元素的 for 循环来简化代码,而无需明确表达如何从一个元素到另一个元素。

【讨论】:

  • 好的,然后 Lint 盲目地给我警告。看来我必须压制警告。我投票赞成你的答案。谢谢。
  • @Ehsan 很高兴。
【解决方案2】:

如果您必须在循环中使用计数器变量,那么切换到使用for each 是没有意义的——本质上,这里的 linter 可能是错误的。

如果您确实想更改它,则需要在for each 之外定义计数器,如下所示:

int i = 0; // your counter, now defined outside of the loop -- but still usable inside
for ( SomeItem e : SomeIterableObj ) { // the for-each loop
    // do something with the element, 'e'
    // do something with the counter, 'i'
    i++; // or manipulate the counter in whichever way you need to.
}

这样,您使用for each 循环,您仍然可以使用计数器。

【讨论】:

  • ssh 答案也很好。但这个似乎更清楚,所以我会接受作为正确答案。
  • @Ehsan 没问题。但我需要补充一点:在这种情况下,您需要检查 SomeIterableObj 大小和您的实际值是否相等。
  • @Ehsan 对,确保i 的值在SomeIterableObj.size() 的上下文中是有意义的(例如,如果您要访问可迭代对象的大小)。 i 可能不应该超过这个值。
【解决方案3】:

如果您正在遍历数组,则 foreach 结构意味着您不需要数组索引。

所以,例如:

int[] myArrayValues = new int[4];

// code to fill up array ...

for (int specificValue : myArrayValues) {
    // specific value is a value from the array, do something useful with it
}

在这种情况下,specificValue 在循环的第一次迭代中等于 myArrayValues[0],然后是 myArrayValues[1]、myArrayValues[2],最后是循环迭代时的 myArrayValues[3]。

请注意,在上面的答案中,虽然有一个变量 i,但它根本不是索引,而是包含数组中的值(在这种情况下,它们都是 0,直到数组被值填充)。

因此,例如对数组中的值求和,我们可以这样做:

int[] items = new int[3];
items[0] = 3;
items[1] = 6;
items[2] = 7;

int sum = 0;

for( int value : items ) {
    sum += value;
}

// at this point sum = 16

把它想象成“对于items中的每个value

【讨论】:

  • 感谢您的简明解释。
猜你喜欢
  • 2023-02-04
  • 2016-02-10
  • 2012-01-31
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多