2017-10-06 4 views
0

なぜ Scalaでリストを作成するのは難しいですか?私は他の多くの言語を知っており、とても簡単なユースケースを見つけようとするのは苦労したことがありません...実装に1分しかかからないものを1時間以上費やしました。私は今、助けを求めている理由は、この時点では少し怒ってScalaでリストを作成する

問題: 私は整数の配列を渡すとの立方体の配列を返すされてやろうとしています奇数

制約:

def cubes(a1: List[Int]): List[Int] = { 
     var a2 = List[Int]() 

     for(i <- 0 to a1.size-1){ 
      if(a1(i)%2 != 0) a2 :+ a1(i) * a1(i) * a1(i) 
     } 

     //If I try to print out the first element I get an error 
     println(a2(0)) 
    } 

    cubes(List(1, 2, 3, 4, 5, 6, 7)) 

これはエラー

list1.scala:15: error: type mismatch; 
found : Unit 
required: List[Int] 
     println(a2(0)) 
      ^
です:
私はリストを使用する必要があり、私はこれは私がこれまで持っているものであるループ

のために使用する必要があります

質問:私の制約を指定してリストを構築できるように、私のコードをリファクタリングするにはどうすればいいですか

答えて

1

varを使用する代わりに、リストをyieldキーワードを使用して理解の対象から戻すことができます。

リスト変数に結果を代入し、それを返す例:上記のコードは、直接のために、理解の結果を返すことによって短縮することができる

scala> cubes(List(1,2,3,4,5)) foreach println 
1 
27 
125 

def cubes(a: List[Int]): List[Int] = { 
    val cubesList = for (item <- a if item % 2 != 0) yield { 
    Math.pow(item, 3).toInt 
    } 
    cubesList //return the list created by the loop 
} 

テストそれ。そして、あなたはまた、中括弧を省略することができます。

def cubes(a: List[Int]): List[Int] = 
    for (item <- a if item % 2 != 0) 
    yield Math.pow(item, 3).toInt 
+0

これは動作しますが、どのように私は、リストに要素を追加し、それを返すことができますか?また、リストに要素を印刷するのにも苦労しています。 a2(0)を実行するとエラーが発生し続けますが、なぜ – Phillip

+0

私はそれを理解したかもしれません。悪い回答を投稿する – Phillip

+1

@ Philips実際に自分でリストを作成する必要はありません。 'for'はリストを返します。あなたは実際に 'val list = for ....'を実行してリストを得ることができます。また、おそらく 'return'を使うべきではありません。[here](https://tpolecat.github.io/2014/05/09/return.html)を参照してください。戻り値をメソッドの最後の行に置いてください。これをもっと明確にするために私の答えを編集しました。 – Shaido

0

ソリューションはListBufferを使用して返す前にそれをリストに変換することです。リストは不変ですので、リストバッファを使用する必要があります。

はまた、私はなっていたエラーは、戻り値の型がList[Int]あるのでだったが、私は何も返していなかったと私は推測しているどの印刷しようとしていたことは、私はまだ非常に怒ってUnit

のいくつかのタイプを返します。それはまあ...把握する

をこの長いを取っここソリューションです:

import scala.collection.mutable.ListBuffer 

    def cubes(a1: List[Int]): List[Int] = { 
     var cubes = new ListBuffer[Int]() 

     for (item <- a1 if item % 2 != 0) yield { 
      cubes += Math.pow(item, 3).toInt 
     } 

     val cubesList = cubes.toList 

     return cubesList 
    } 

    println(cubes(List(1, 2, 3, 4, 5, 6, 7))) 
    println(cubes(List(3, 5, 6, 7, 11))) 
+2

1 'ListBuffer'はすでに変更可能ですので、' cubes'は 'var'である必要はありません。 2 - 'cubesList'を作る理由はありません。 'cubes.toList'を返すだけです。 3 - 慣用的なScalaは 'return'ステートメントを使用しません。 4 - あなたの制約は、実際にはリストから一から作成する必要があるとは言いません。 (どちらも** **慣用的なScalaではありません)@Shaidoはより良い解決策を持っています。 – jwvh

関連する問題