首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala / list -任何引用当前筛选列表以获得当前大小的方法(而不是原始的大小)

Scala / list -任何引用当前筛选列表以获得当前大小的方法(而不是原始的大小)
EN

Stack Overflow用户
提问于 2016-12-30 16:52:17
回答 1查看 41关注 0票数 0
代码语言:javascript
复制
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

我正在尝试一个问题来获得的平均书名长度,是以年份写成的偶数的书籍。

在这种情况下,我希望能够确定4,而不是硬编码,并且不需要在内存中使用第二个值。

有没有办法说“这个”或“先前”之类的词来指当前(过滤)列表的长度--试图在谷歌上搜索,但我很难用这个词来表达对搜索引擎的查询。

事先非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-30 17:03:51

如何将foldLeftmatch结合使用?也许有点复杂,但您可以使用foldLeft生成一对,第一个值是列表的和,第二个值是列表长度的计数器,然后使用match计算平均值(除以长度):

代码语言:javascript
复制
(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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41399736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档