新手斯卡拉。
我正在努力让这段代码工作几个小时。它旨在使用整数的绝对值更新List [Int](整数列表)。 花了很长时间才弄清楚List是不可变的,所以发现ListBuffer可以成为救世主,但最终将它返回到List表格中我看到了一些问题。
def f (arr:List[Int]) : List[Int] =
{
val list = new scala.collection.mutable.ListBuffer[Int]();
val len = arr.length;
for ( i <- 0 to len)
{
if(arr(i) < 0)
{
list.append((-1)*arr(i)) ;
}
else
{
list.append(arr(i));
}
}
return list.toList;
}
给出了这个错误:
java.lang.IndexOutOfBoundsException: 12
at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:52)
at scala.collection.immutable.List.apply(List.scala:84)
at Solution$.f(Solution.scala:7)
at Solution$delayedInit$body.apply(Solution.scala:23)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:71)
at scala.App$$anonfun$main$1.apply(App.scala:7...
这里没有弄错。
答案 0 :(得分:4)
最好的方法是使用评论中建议的@senia等Scala函数。例如:
val res = list map math.abs
但是,如果您想修复代码,请将to
替换为until
。你错过了一个错误:
def f (arr:List[Int]) : List[Int] =
{
val list = new scala.collection.mutable.ListBuffer[Int]();
val len = arr.length;
for ( i <- 0 until len)
{
if(arr(i) < 0)
{
list.append((-1)*arr(i)) ;
}
else
{
list.append(arr(i));
}
}
return list.toList;
}
以下是until
和to
:
1 to 3
// Range(1, 2, 3)
1 until 3
// Range(1, 2)
您还可以删除与return
一起使用的;
,{
甚至大括号if/else
。
答案 1 :(得分:1)
另一个版本使用for
理解来避免索引,
def f (arr:List[Int]) : List[Int] =
{
val list = new scala.collection.mutable.ListBuffer[Int]();
for {
a <- arr
sign = if (a < 0) -1 else 1
} list.append(sign * a)
return list.toList;
}
如上所述,return
可能会被省略。
答案 2 :(得分:0)
您可以尝试使用case语句来获得更简洁的语法:
def f(arr:List[Int]):List[Int] = {
val list = scala.collection.mutable.ListBuffer[Int]()
arr.foreach{
x =>
x match {
case _ if (x <0) => list+= (x*(-1))
case _ => list +=x
}
}
list.toList
}
答案 3 :(得分:0)
看起来你正试图解决here的挑战。可能你可能想要使用更多功能方法与递归和不可变List。
def f(arr: List[Int]): List[Int] = arr match {
case Nil => Nil
case x :: rest => java.lang.Math.abs(x) :: f(rest)
}
答案 4 :(得分:0)
初学友好:这就是我写的方式
def f(arr: List[Int]) : List[Int] = {
var list = new scala.collection.mutable.ArrayBuffer[Int]();
// var len = arr.length;
for(i <-0 until arr.length) {
list.append( math.abs(arr(i)));
}
return list.toList; }
我没有进行任何时间复杂度分析,但对于初学者来说,这是最直接的理解。此外,它通过hackerrank的所有测试
答案 5 :(得分:0)
def f (arr: List[Int]) : List[Int] = {
arr.map {
case i if 0 > i => i * -1
case i => i
}
}