scala - 在 Traversable 的 foreach 方法中获取当前元素的索引?

标签 scala

假设我有两个数组:

val ar1 = Array[String]("1", "2", "3")
val ar2 = Array[String]("1", "2", "3", "4")

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

List.range(0, ar1.size).foreach(i => println(ar1(i)+ar2(i)))

如果有一个 foreach 变体,它允许我直接使用 ar1 的索引,而不是首先构建整数列表,那就更好了。

也许有更好的方法?

最佳答案

一种非常方便的方法是使用元组上的 zipped 方法。将两个集合放入,取出函数的两个参数!

(ar1,ar2).zipped.foreach((x,y) => println(x+y))

这既方便编写又快速,因为您不需要构建一个元组来存储每对(就像使用 (ar1 zip ar2) 一样),然后您必须将其获取再次分开。当两个系列中较短的一个用完时,两种形式的 zipper 都会停止。

如果你有更复杂的东西(例如,你需要对索引进行数学运算),规范的解决方案是压缩索引:

ar1.zipWithIndex.foreach{ case(x,i) => println(x+ar2(i)) }

您使用的方法更快速、更紧凑,如下所示,可能很有用:

ar1.indices.foreach(i => println(ar1(i)+ar2(i)))

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

(0 until (ar1.size min ar2.size)).foreach(i => println(ar1(i)+ar2(i)))

解决这个问题。 (您可以明白为什么 zipzipped 是首选,除非您正在做的事情太复杂而无法轻松完成。)

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

{ var i=-1; ar1.foreach{ x => i += 1; println(x+ar2(i)) } }

在极少数情况下需要这样做(例如,如果您可能想跳过或回溯某些其他集合);如果您可以避免这样做,通常会得到更容易推理的代码。

关于scala - 在 Traversable 的 foreach 方法中获取当前元素的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6821194/

相关文章:

scala - 诈骗 "illegal nesting"错误

scala - 将 Map[String, Seq[Int]] 转换为 Seq[Seq[Int]]

json - 将多个 json 对象转换为 scala 对象

scala - 如何使用 Play Framework 2.0 创建全局变量

Scala 集合 : Is there a safe map operation?

scala - `##` 和 `hashCode` 和有什么区别?

scala - 是否有一个与 Scala 的 JavaConverters 等效且不使用 Wrappers 的 Scala 库(即开源)?

scala - 通过 build.sbt 将单个依赖 jar 复制到文件夹中

scala - 在 Play Framework 中发送文件后进行清理

scala protected 修饰符转换为 java 类是公共(public)的