2016-11-16 4 views
0

この質問は重複している可能性がありますが、私は答えを見つけられません。 Scalaの私の無知の知識を許してください。私はかなり初心者です。作成方法オプションリストのリスト[Double] forループScala

私の目的は、長さの異なる2つのリストをループし、List[List[Option[Double]]]を返すことです。

これまでの私のコード:

def getDoubles(symbol: String, year: Int): Option[Double] = { 
    return Some(140.0) 
} 

// this method loops over list of strings and range of time. returns list of list of Option[Double] 
def checkList(CSV: List[String], time: Range): List[List[Option[Double]]] = { 
    // this variable is whats going to be returned at the end 
    var listOfLists = List[List[Option[Double]]]() 
    // So we are going to loop over our list and our time, and link each element in our list to all the elements in   our time range 
    for { 
    i < -CSV 
    j < -time 
     // the method getDoubles is pretty long, so i just made another version simplfying my question. 
     // get doubles bascially returns Option of doubles 
    } 
    yield (listOfLists = getDoubles(j, i)::listOfLists) 
    return listOfLists 
} 

上記のコード、私はより洗練されたデータとそれを呼び出すとき、それが返されます。

Vector(
    Some(313.062468), 
    Some(27.847252), 
    Some(301.873641), 
    Some(42.884065), 
    Some(332.373186), 
    Some(53.509768) 
) 

をしかし、私はこのような何かを返したい:

List(
    List(Some(313.062468), Some(27.847252)), 
    List(Some(301.873641), Some(42.884065)), 
    List(Some(332.373186), Some(53.509768)) 
) 

どうすればいいですか?

+0

このケースは簡単ですが、将来的には、あなたの「洗練されたデータ」を提供してください(例として、人々は答えのコードで簡単に試してみることができるようにします)。 – laughedelic

答えて

3

これには可変変数を使用する必要はありません。まず、ネストされたリストが必要な場合は、ネストされたforが必要です。次にyieldには、forによって生成されたコレクションの各要素がどのように見えるかを記述する必要があります。ループボディではないので、あなたはそこで何か突然変異をすることは想定されていません。 for -expression全体が結果のコレクションになります。 Scala FAQを"How does yield work?"にチェックしてください。 FOR-理解

def checkList(csv: List[String], time: Range): List[List[Option[Double]]] = { 
    for { 
    symbol <- csv 
    } yield { 
    for { 
     year <- time.toList 
    } yield getDoubles(symbol, year) 
    } 
} 

mapflatMapfilterの組み合わせのためだけの構文糖です。この場合mapでそれを書いて、より簡潔で非常に簡単です:

def checkList(csv: List[String], time: Range): List[List[Option[Double]]] = { 
    csv map { symbol => 
    time map { year => 
     getDoubles(symbol, year) 
    } 
    } 
} 

"What is Scala's yield?"質問を参照してください。

+1

あなたが言ったことはすべてポイントであり、あなたの解決策は私の混乱がどこにあったのかを明確にしました。私はあなたを溶かします。 –

関連する問題