使用绝对值更新列表的值

时间:2014-01-19 17:20:03

标签: list function scala functional-programming listbuffer

新手斯卡拉。

我正在努力让这段代码工作几个小时。它旨在使用整数的绝对值更新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...

这里没有弄错。

6 个答案:

答案 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;

}

以下是untilto

之间的区别
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
 }
}