2015-12-02 103 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)