【问题标题】:For each to For Loop ConversionFor each 到 For 循环转换
【发布时间】:2012-12-19 10:34:14
【问题描述】:

我可以知道如何将每个循环的以下内容转换为普通的 for 循环吗?

for (SortedMap.Entry<Integer, String> entry : mapDefect.entrySet())

我有一个count 变量作为起点,地图的终点作为终点。那么如何将其转换为普通的 for 循环呢?

【问题讨论】:

  • 所以,要明确一点,您只想从count-th 元素一直查找到地图的末尾?
  • @irrelephant 不。我想从 'count' 变量开始直到地图结束。
  • 许多 IDE 都可以为您转换 for 循环类型。这些更改代码并根据需要添加任何变量。它更快,更不容易出错。我会看看你的 IDE 能为你做什么。顺便说一句,它是 Map.Entry 而不是 SortedMap.Entry

标签: java for-loop foreach


【解决方案1】:

Section 14.14.2 of the JLS 给出翻译。在这种情况下,大概是:

for (Iterator<SortedMap.Entry<Integer, String>> iterator
         = mapDefect.entrySet().iterator();
     iterator.hasNext(); )
{
    SortedMap.Entry<Integer, String> entry = iterator.next();
    // ...
}

或者,使用GuavaIterables 类获取排序集的一部分:

Iterable<SortedMap.Entry<Integer, String>> section = Iterables.limit(
    Iterables.skip(mapDefect.entrySet(), start), end - start);
for (SortedMap.Entry<Integer, String> entry : section) {
    // ...
}

或者如果它是来自count只是(带有澄清评论):

for (SortedMap.Entry<Integer, String> entry :
         Iterables.skip(mapDefect.entrySet(), count)) {
    // ...
}

【讨论】:

  • 您仍然需要使用迭代器方法添加计数变量,在这种情况下,使用计数变量支持的 for-each 也可以。 IMO 没有直接的方法可以使用计数变量从 for-each 切换到 for(例如可用于数组的变量)
  • @Scorpion:我回答的第一部分是将增强的 for 循环转换为“正常”循环。我的答案的第二部分是一种替代方法,只遍历集合的一部分。
  • @Scorpion:当然,在 C# 中使用 LINQ 和扩展方法会简单得多;)不过,Java 8...
  • @Scorpion 和 Jon Skeet 嘿!谢谢。解决了这个问题。 :)
【解决方案2】:

你说任务是跳过第一个count元素,然后处理其余的。

这可以通过“for”循环或“for each”循环来完成。在这种情况下,我会将其保留为“for each”循环:

int i = 0;
for (SortedMap.Entry<Integer, String> entry : mapDefect.entrySet()) {
   if (i++ < count) continue;
   ...
}

【讨论】:

  • 是的 - 我也没有理由转向迭代器。
【解决方案3】:

推荐的迭代地图的方法是使用迭代器或 for-each 循环(使用迭代器)。

将您的 for each 循环转换为“正常”循环可以在您的情况下工作,因为您使用整数作为映射键:

for (int i = 0; i < mapDefect.size(); i++) {
  String value = mapDefect.get(i)
  // do something with value
}

但请注意,这仅在您使用映射键时才有效,因为您将使用数组/列表索引(这使得映射无用)。 要使用这种循环,您必须使用连续的正整数作为从 0 开始的映射键

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    相关资源
    最近更新 更多