我是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
向量的元素。我无法找到一个可以帮助我做到这一点的在线资源。请帮忙。
答案 0 :(得分:1)
以下内容应该有效:
out.zip(exp) map { case (o,e) => if (e < 0) o >> e.abs else o }
答案 1 :(得分:1)
向量是不可变集合,您无法对其进行修改,但您可以创建新的集合。为此,请用于收益率理解:
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
并修改你的数组。
答案 2 :(得分:0)
或者通过将转换置于函数中然后只进行单个映射操作,使转换显式且可读性更强。
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)
答案 3 :(得分:0)
可以通过exp(i)
(如果为负)或0
(无效)将变换添加到lambda函数来避免额外的迭代,否则就像这样,
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)
}