在Scala中修改元组数组

时间:2015-12-02 08:54:59

标签: scala

我是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向量的元素。我无法找到一个可以帮助我做到这一点的在线资源。请帮忙。

4 个答案:

答案 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)
}