scala - 如何在列表中找到成绩最好的学生?

标签 scala list-comprehension

假设,我有一个学生列表。 学生姓名出生日期年级等字段。您如何找到学生 拥有 Scala 中最好的成绩

例如:

List(Student("Mike", "A"), Student("Pete", "B"), Student("Paul", A))"

我想要得到

List(Student("Mike", "A"), Student("Paul", A))

显然,我可以找到最高成绩(上面列表中的“A”),然后过滤列表

students.filter(_.grade == max_grade)

此解决方案的复杂度为O(N),但会遍历列表两次。您能提出更好的解决方案吗?

最佳答案

运行列表两次可能是最好的方法,但是如果您坚持只运行一次的解决方案,则可以使用折叠(此处适用于空列表):

(List[Student]() /: list){ (best,next) => best match {
  case Nil => next :: Nil
  case x :: rest =>
    if (betterGrade(x,next)) best
    else if (betterGrade(next,x)) next :: Nil
    else next :: best
}}

如果您不熟悉折叠,答案 here 中对此进行了描述。 。它们是当您传递集合(例如列表)时积累某些内容的通用方法。如果您不熟悉匹配,可以使用 isEmptyhead 执行相同的操作。如果您希望学生的顺序与原始列表中出现的顺序相同,请在最后运行 .reverse

关于scala - 如何在列表中找到成绩最好的学生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8093490/

相关文章:

python - for/in/if 列表理解在大量匹配项下变得非常慢

java - 在 Scala 中迭代 Java 集合

scala - 将 'for' 循环从 Java 重写为 Scala

scala - 使用多态函数作为参数

for循环中的Scala println

python - 什么时候使用过滤函数而不是列表理解?

python - 以特定字典的值应该放在第一位的方式对字典列表进行排序

scala - 在 spray-json 中返回带有对象属性子集的 json 响应

python - `[b for a in x for b in a if not b==k]` 是什么意思?

Python:从理解中删除空列表