我是scala的新手,我不确定将用c ++编写的for / if循环转换为scala的最佳方法是什么。我正在翻译我的整个文档,以便有人能给我一个有用的第一步!
假设array1
,array2
,array3
和array4
都已初始化且大小为n-1
代码是
n=10
k=4
for(i=0,i<n,i++) {
if (array1(i) > k){
array2(i)=0
}
else if (array1(i)>-k) {
if (array3(i)>0) {
array2(i)=1
array4(i)=2
}
else {
array2(i)=2
array4(i)=0
}
else {
array2(i)=3
array4(i)=4
}
}
答案 0 :(得分:1)
在你的情况下像
for( n <- 0 until 10){
...
}
将是最简单的循环。 直到独占结束。如果要循环包含结尾,则使用到而不是直到。您可能还想考虑使用模式匹配而不是嵌套的if / elses。 以下是一些以交互方式介绍Scala基础知识的链接: http://scalatutorials.com/
答案 1 :(得分:0)
这是一种以方便(几乎类似Scala)的方式处理大量相同大小的数组的方法:
第一个提示是使用转置到&#34;配对&#34;同一索引的元素在一起。
val tmp = Array(Array(1,2), Array(3,4), Array(5,6)).transpose
> tmp: Array[Array[Int]] = Array(Array(1, 3, 5), Array(2, 4, 6))
然后我们甚至可以使用模式匹配来轻松地引用相应的元素(x,y,z,...):
for(Array(x,y,z) <- tmp) yield x + 2y + z/2
> Array[Int] = Array(9, 13)
我不打算复制整个逻辑,但这足以让你以这种方式重写你的逻辑:
使用REPL:
scala> val a1 = Array(1,2,3,4,5)
a1: Array[Int] = Array(1, 2, 3, 4, 5)
scala> val a2 = Array(11,21,31,41,51)
a2: Array[Int] = Array(11, 21, 31, 41, 51)
scala> val a3 = Array(22,22,32,42,52)
a3: Array[Int] = Array(22, 22, 32, 42, 52)
scala> val a4 = Array(9,8,7,6,4)
a4: Array[Int] = Array(9, 8, 7, 6, 4)
// zipWithIndex gives us access to "i" as we iterate over the array
scala> val toIterate = Array(a1,a2,a3,a4).transpose.zipWithIndex
toIterate: Array[(Array[Int], Int)] = Array((Array(1, 11, 22, 9),0), (Array(2, 21, 22, 8),1), (Array(3, 31, 32, 7),2), (Array(4, 41, 42, 6),3), (Array(5, 51, 52, 4),4))
for( j <- toIterate ) {
j match {
case (Array(e1,e2,e3,e4),i) if e1 > 4 => a1(i) = 3
// add more cases here ...
case (_,i) => a3(i)=3; a4(i) = 4
}
}
答案 2 :(得分:0)
这是你的算法的scala-ish音译,但实际上没有上下文,很难说出你想要实现的目标,正如@Archeg所说。
初始化内容
val n = 10
val k = 4
val input1 = new Array[Int](n)
val input3 = new Array[Int](n)
(重命名数组以更好地代表他们所使用的内容) 我们以锁步方式遍历数组,因此将它们压缩在一起以形成相同索引的元素对,并完成:
val res = {for ((a, b) <- input1 zip input3)
每次,我们也为该指数的输出生成("yield"
)一对
yield {
if (a > k) {
(0, 0) // here we assume a value for array4. Not clear what is intended
} else if (a > -k) {
if (b > 0) {
(1, 2)
} else {
(2, 0)
}
} else {
(3, 4)
}
所以现在我们有一对结果元素对。将其解压缩到对的第一个和第二个元素的两个数组
val (array2, array4) = res.unzip
那么,这样更好吗?它没有明确地使用索引,因此不太可能出现一个一个错误,或者意外地使用错误的索引。但是,它是否更清楚地表达了你的意图取决于你的代码应该做什么。如果我们知道它的意思,可能有更清晰的方法。