修改元组的阵列,斯卡拉
问题描述:
我是新来的Scala,并希望有关以下代码的任何帮助:修改元组的阵列,斯卡拉
var exp = (-3).to(2, 1)
var out = exp.map(i => java.lang.Float.floatToIntBits(math.pow(i, 2).toFloat))
现在,我要写出下面的代码:
for (i <- 0 until exp.length)
{if(exp(i) < 0)
{out(i) = out(i) >> exp(i).abs}
}
那是,我想要修改out
矢量的元素,具体取决于exp
矢量的元素,方法是在两个矢量之间进行一对一的映射。我无法找到一个可以帮助我做到这一点的在线资源。请帮忙。
答
额外迭代可以通过添加转变至lambda函数来避免或者通过exp(i)
如果负或由0
(无效果),否则,就这样,
var out = exp.map { i =>
val f = java.lang.Float.floatToIntBits(math.pow(i, 2).toFloat)
f >> (if (i < 0) -i else 0)
}
还要注意
def step(i: Int) = if (i < 0) -i else 0
这样我们可以简化上面的解决方案如下,
var out = exp.map { i =>
java.lang.Float.floatToIntBits(math.pow(i, 2).toFloat) >> step(i)
}
答
下面应该工作:
out.zip(exp) map { case (o,e) => if (e < 0) o >> e.abs else o }
答
的载体是不变集合,你不能修改它,但你可以创建新的一个。为此,使用屈服理解:
val res = for (i <- 0 until exp.length)
yield if(exp(i) < 0)
out(i) >> exp(i).abs
else
out(i)
或只是转换你的向量数组:
val out = exp.map(i =>
java.lang.Float.floatToIntBits(math.pow(i, 2).toFloat)
).toArray
和修改阵列。
答
或者通过将转换放入一个函数中,然后只进行一次映射操作,使转换更加明确,并且可以说更具可读性。
def fn(i: Int): Int = {
val o = java.lang.Float.floatToIntBits(math.pow(i, 2).toFloat)
if (i < 0) o >> i.abs
else o
}
exp.map(fn)