首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取Traversable的foreach方法中当前元素的索引?

获取Traversable的foreach方法中当前元素的索引?
EN

Stack Overflow用户
提问于 2011-07-26 03:23:26
回答 4查看 55.2K关注 0票数 61

假设我有两个数组:

代码语言:javascript
复制
val ar1 = Array[String]("1", "2", "3")
val ar2 = Array[String]("1", "2", "3", "4")

现在,对于ar1的每个元素,我希望首先将该元素与ar2的相应元素连接起来,然后打印结果。一种方法是这样做:

代码语言:javascript
复制
List.range(0, ar1.size).foreach(i => println(ar1(i)+ar2(i)))

如果有一个foreach变体,让我可以直接使用ar1的索引,而不是先构造整数列表,那就更好了。

也许有更好的方法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-26 04:02:44

要做到这一点,一种非常方便的方法是对元组使用zipped方法。放入两个集合,得到一个函数的两个参数!

代码语言:javascript
复制
(ar1,ar2).zipped.foreach((x,y) => println(x+y))

这既方便编写又快速,因为您不需要构建一个元组来存储每一对(就像使用(ar1 zip ar2)时一样),然后您必须再次拆分它们。当两个集合中较短的一个耗尽时,两种形式的拉链都会停止。

如果你有一些更复杂的东西(例如,你需要在索引上做数学运算),标准的解决方案是压缩索引:

代码语言:javascript
复制
ar1.zipWithIndex.foreach{ case(x,i) => println(x+ar2(i)) }

您正在使用的方法可以更快速、更简洁地完成,如下所示,这可能是有用的:

代码语言:javascript
复制
ar1.indices.foreach(i => println(ar1(i)+ar2(i)))

尽管这只在第一个集合不长于第二个集合的情况下才有效。你也可以明确地指定你的范围:

代码语言:javascript
复制
(0 until (ar1.size min ar2.size)).foreach(i => println(ar1(i)+ar2(i)))

来解决这个问题。(您可以理解为什么首选zipzipped,除非您所做的工作太复杂而无法轻松工作。)

如果它不是并行集合(通常不是,除非调用.par),也可以使用可变变量进行跟踪,但不推荐这样做:

代码语言:javascript
复制
{ var i=-1; ar1.foreach{ x => i += 1; println(x+ar2(i)) } }

在非常有限的情况下,这是必要的(例如,如果你想跳过或回溯一些其他集合);如果你可以避免不得不这样做,你通常会得到更容易推理的代码。

票数 103
EN

Stack Overflow用户

发布于 2011-07-26 03:36:32

这就是如何在惯用的Scala中使用索引进行循环:

代码语言:javascript
复制
scala> List("A", "B", "C").zipWithIndex foreach { case(el, i) =>
     |   println(i + ": " + el)
     | }
0: A
1: B
2: C

以下是Scala的惯用方法,可以在代码中实现您想要实现的功能:

代码语言:javascript
复制
scala> val arr1 = Array("1", "2", "3")
arr1: Array[java.lang.String] = Array(1, 2, 3)

scala> val arr2 = Array("1", "2", "3", "4")
arr2: Array[java.lang.String] = Array(1, 2, 3, 4)

scala> (arr1, arr2).zipped.map(_ + _) foreach println
11
22
33
票数 40
EN

Stack Overflow用户

发布于 2011-07-26 03:31:54

我没有机会对其进行测试,但下面的代码应该可以解决这个问题:

代码语言:javascript
复制
ar1.zip(ar2).foreach(x => println(x._1 + x._2))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6821194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档