假设我有两个数组:
val ar1 = Array[String]("1", "2", "3")
val ar2 = Array[String]("1", "2", "3", "4")
Run Code Online (Sandbox Code Playgroud)
现在对于每个元素ar1,我想首先将该元素与相应的元素连接起来,ar2然后打印结果.一种方法是:
List.range(0, ar1.size).foreach(i => println(ar1(i)+ar2(i)))
Run Code Online (Sandbox Code Playgroud)
如果有一个foreach变体允许我直接使用索引ar1而不是首先构造整数列表,那会更好.
也许有更好的方法?
Rex*_*err 95
一种非常方便的方法是使用zipped元组上的方法.放入两个集合,得出一个函数的两个参数!
(ar1,ar2).zipped.foreach((x,y) => println(x+y))
Run Code Online (Sandbox Code Playgroud)
这既便于编写又快速,因为您不需要构建一个元组来存储每一对(就像您一样(ar1 zip ar2)),然后您必须再次拆分它们.当两个集合中较短的一个用尽时,两种形式的zip都会停止.
如果你有更复杂的东西(例如你需要对索引进行数学运算),那么规范的解决方案是在索引中压缩:
ar1.zipWithIndex.foreach{ case(x,i) => println(x+ar2(i)) }
Run Code Online (Sandbox Code Playgroud)
您正在使用的方法更快速,更紧凑地完成如下操作,这可能很有用:
ar1.indices.foreach(i => println(ar1(i)+ar2(i)))
Run Code Online (Sandbox Code Playgroud)
虽然这仅在第一个集合不长于第二个集合时才有效.您还可以explcitly指定您的范围:
(0 until (ar1.size min ar2.size)).foreach(i => println(ar1(i)+ar2(i)))
Run Code Online (Sandbox Code Playgroud)
解决这个问题.(你可以看到为什么zip并且zipped是首选,除非你正在做的事情太复杂而不能轻松工作.)
如果它不是并行集合(通常除非你打电话.par,它通常不会),尽管不建议,也可以跟踪一个可变变量:
{ var i=-1; ar1.foreach{ x => i += 1; println(x+ar2(i)) } }
Run Code Online (Sandbox Code Playgroud)
有必要的情况非常有限(例如,如果您可能想跳过或回溯其他一些集合); 如果你可以避免这样做,你通常会得到更容易推理的代码.
mis*_*tor 40
这是你在惯用Scala中循环索引的方法:
scala> List("A", "B", "C").zipWithIndex foreach { case(el, i) =>
| println(i + ": " + el)
| }
0: A
1: B
2: C
Run Code Online (Sandbox Code Playgroud)
以下是您在代码中尝试实现的惯用Scala方法:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
45996 次 |
| 最近记录: |