假设,我有一个学生
列表。 学生
有姓名
、出生日期
、年级
等字段。您如何找到学生
拥有 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 中对此进行了描述。 。它们是当您传递集合(例如列表)时积累某些内容的通用方法。如果您不熟悉匹配,可以使用 isEmpty
和 head
执行相同的操作。如果您希望学生的顺序与原始列表中出现的顺序相同,请在最后运行 .reverse
。
关于scala - 如何在列表中找到成绩最好的学生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8093490/