2016-12-30 6 views
0
case class Book(title: String, authors: List[String], year: Int) 

val books: List[Book] = List(
    Book("Structure and Interpretation of Computer Programs", 
    List("Abelson, Harold", "Sussman, Gerald J."), 1984), 
    Book("Principles of Compiler Design", 
    List("Aho, Alfred", "Ullman, Jeffrey"), 1977), 
    Book("Programming in Modula-2", 
    List("Wirth, Niklaus"), 1982), 
    Book("Introduction to Functional Programming", 
    List("Bird, Richard"), 1988), 
    Book("The Java Language Specification", 
    List("Gosling, James", "Joy, Bill", "Steele, Guy", 
     "Bracha, Gilad"), 1996) 
) 


books.filter{x => x.year % 2 == 0} 
    .map(_.title.length) 
    .sum/4.toDouble 

のサイズを取得するには、現在のフィルタリングされたリストを参照する方法は、私は年に書かれた本のタイトル平均の長さを取得するには、問題をしようとしていています偶数であるである。スカラ/リスト - 現在の(いない元のサイズ)

この場合は、ハードコーディングするのではなく、メモリ内の2番目の値を使用せずに、4を判断できるようにしたいと考えています。

現在の(フィルタリングされた)リストの長さを参照する 'this'や 'previous'のような言い方はありません。これをgoogleにしようとしましたが、検索エンジンの検索クエリに苦労しています。

事前に多くの感謝

+0

私はそれを行うことができます私はメモリを浪費したい場合は、 –

+0

を合計する前に値に割り当てます。 :-) – TheDavil

+1

真剣に? 4バイト? –

答えて

3

どうmatchfoldLeftを使用してはどうですか?たぶん少し複雑ですが、foldLeftを使用して、最初の値をリストの合計とし、2番目の値をリストの長さのカウンタとし、次にmatchを使用して合計を(長さ):

(books.filter{x => x.year % 2 == 0} 
     .map(_.title.length) 
     .foldLeft((0, 0))((x, y) => (x._1 + y, x._2 + 1)) 
     match { case(x,y) => x.toDouble/y}) 

# res73: Double = 35.25 
+0

私は今アキュムレータなどの使用を参照してくださいと思う、私はちょうどこの作品(私はスカラn00bです)の周りに完全に私の頭をラップする必要があります。ありがとう! – TheDavil

+0

私の正気については、私の試験でこれを(非効率なバージョン)暗記します: books.filter {x => x.year%2 == 0} .map(x => x.title.length) .sum/books.count {x => x.year%2 == 0}しかし、あなたのバージョンははるかにエレガントです。ありがとうございます。 – TheDavil

関連する問題