gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:16:33 25 4
gpt4 key购买 nike

假设我有两个数组:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com