1

Scala的新手。

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

不明白这里有什么问题。

4

6 回答 6

4

最好的方法是使用评论中建议的 @senia 等 Scala 函数。例如:

val res = list map math.abs

但是,如果您想修复代码,只需替换tountil. 您因一个错误而下车:

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

于 2014-01-19T17:29:14.520 回答
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可以省略。

于 2014-01-20T10:04:35.757 回答
0
def f (arr: List[Int]) : List[Int] = {
 arr.map {
     case i if 0 > i => i * -1
     case i => i
 }
}
于 2018-10-10T05:26:46.717 回答
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的所有测试

于 2017-06-17T01:45:36.347 回答
0

看起来你正试图从这里解决挑战。可能您可能希望对递归和不可变列表使用更多功能的方法。

def f(arr: List[Int]): List[Int] = arr match {
  case Nil => Nil
  case x :: rest => java.lang.Math.abs(x) :: f(rest)
}
于 2017-05-14T11:27:48.107 回答
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
}
于 2017-05-08T02:19:05.537 回答