2015-12-02 104 views
1

我是新来的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

额外迭代可以通过添加转变至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) 
} 
1

下面应该工作:

out.zip(exp) map { case (o,e) => if (e < 0) o >> e.abs else o } 
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 

和修改阵列。

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)