1

スカラ初心者。

このコードを数時間動作させようとしています。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

ただし、コードを修正したい場合は、 に置き換えtoてくださいuntil。あなたは1つのエラーで降りています:

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 に答える