2017-02-18 13 views
-1

私はScalaで新しいです。Scalaのリストのインデックス

例えば、私は

val s = List(5, 11, 15, 7)

のようなリストを持っていると私は私が言語を使用することはできません10以上の要素のインデックスの新しいリストを作成するためにラムダ関数を必要としますScalaライブラリまたは関数標準的なScalaの機会のみ。

どのようにこれらの要素のインデックスを計算できますか?ありがとうございました!

+3

あなたの宿題...? –

+0

@groenhenに近い) – Alex

+1

他の人に、自分が割り当てたものか実際のコースの割り当てのどちらが明確であるかの回答を提供することは、どのように役立ちますか? –

答えて

0

は、このコードを試してみてください。

val lambda = (list: List[Int]) => { 

    def filterList(l : List[Int], condition : Int, index: Int, acc: List[(Int, Int)]) : List[(Int, Int)] = l match { 
    case List() => acc 
    case h::tail => 
     if (h > condition) filterList(tail, condition, index + 1, (index, h) :: acc) 
     else filterList(tail, condition, index + 1, acc) 
    } 

    filterList(list, 10, 0, List()) 
} 

val r = lambda(s) 
+0

ありがとうございますが、私は組み込み関数(zipWithIndexなど)を使用することはできません – Alex

+0

ちょうど更新されていますが、これは高次関数になるように条件をいくつかの関数に置き換える必要があると私は考えます – Pavel

+0

私は "lambdas "上記のコードをlambdaのテンプレートとして再利用できるので、あまり関係ありません。 – Pavel

0

うーん...これを解決するための5月の方法があります。

まず varと、より広範囲「不可欠」様のソリューションを見ることができます

val lambda = (list: List[Int]) => { 
    var indexList = List.empty[Int] 
    var i = 0 
    for (elem <- list) { 
    if (elem > 10) indexList = i +: indexList 
    i = i + 1 
    } 
    indexList.reverse 
} 

今...私たちは、より多くのビット「機能的に似た」再帰的なアプローチで見ることができ

val lambda = (list: List[Int]) => { 
    def _inner(list: List[Int], index: Int, indexList: List[Int]) = { 
    list match { 
     case Nil => indexList 
     case elem :: tail => { 
     if (elem > 10) _inner(tail, index + 1, index +: indexList) 
     else _inner(tail, index + 1, indexList) 
     } 
    } 
    } 

    _inner(list, 0, List.empty[Int]).reverse 
} 
+0

*名前付きメソッド* a *ラムダ*を呼び出すのは面白いです。 –

+0

はい...面白いです。 –

関連する問題