使用 Scala 进行分组以便于理解
Grouping with Scala For-Comprehention
我最近考试不及格,主要的一点是我必须使用 for-comprehensions,或者更确切地说,ONLY for-comprehensions 的任务。
数据:List[(day: Int, month: String, reason: String, km: int)]
val data = List(
(25, "February", "1", 25),
(17, "April", "1", 63),
(19, "March", "3", 45),
(17, "October", "4", 12),
(25, "December", "1", 45),
(9, "January", "2", 56),
(17, "April", "1", 54),
(21, "September", "3", 16),
(3, "May", "2", 59),
(20, "January", "4", 46),
(28, "June", "5", 28),
(19, "March", "3", 34),
(29, "August", "1", 42),
(17, "April", "1", 77)
)
def moreThanTwoViolations(maxKm: Int, in: List[(Int, String, String, Int)]) : List[(Int, String)] = ???
任务:
找出所有的日子,其中至少有 2 次 minKm > km
出于相同或不同的原因。
示例:
如果 maxKm = 30
那么 List[(19, "March", "2", 45), (19, "March", "3", 34)]
是相关的,因为 2 reason
满足 _._4 > 30
,所以我会 return List[(19, "March")]
。
我不知道如何在不使用 groupBy
的情况下解决这个问题,因为这意味着我必须每天 "remember" 将我的当前状态转换为我已经看过的状态。而且我无法保持理解状态。
第 2 部分将去除第 1 部分的糖分,因此不要使用 for-comps,仅使用 map
、flatmap
和 filter
.
抱歉,如果这看起来像一个菜鸟问题,但如果不分组这似乎很荒谬,我只想知道我在这里错过了什么。
reddit 上的一个人帮我解答了。事实证明,您不需要保持状态来满足这个特定要求,只需构建一个 whack 条件即可。我想我考试不及格是有原因的
def moreThanTwoViolations( maxKm: Int,
in: List[(Int, String, String, Int)]
) : List[(Int, String)] = {
(for {
line1 <- data
line2 <- data
if line1._1 == line2._1 &&
line1._2 == line2._2 && // ._1 and ._2 are the date (needs to be different)
line1._3 != line2._3 && // ._3 is the reason. has to be different to add up to 2
line1._4 > maxKm &&
line2._4 > maxKm // both km need to be > maxKm
} yield (line1._1, line1._2)
).distinct
}
我最近考试不及格,主要的一点是我必须使用 for-comprehensions,或者更确切地说,ONLY for-comprehensions 的任务。
数据:List[(day: Int, month: String, reason: String, km: int)]
val data = List(
(25, "February", "1", 25),
(17, "April", "1", 63),
(19, "March", "3", 45),
(17, "October", "4", 12),
(25, "December", "1", 45),
(9, "January", "2", 56),
(17, "April", "1", 54),
(21, "September", "3", 16),
(3, "May", "2", 59),
(20, "January", "4", 46),
(28, "June", "5", 28),
(19, "March", "3", 34),
(29, "August", "1", 42),
(17, "April", "1", 77)
)
def moreThanTwoViolations(maxKm: Int, in: List[(Int, String, String, Int)]) : List[(Int, String)] = ???
任务:
找出所有的日子,其中至少有 2 次 minKm > km
出于相同或不同的原因。
示例:
如果 maxKm = 30
那么 List[(19, "March", "2", 45), (19, "March", "3", 34)]
是相关的,因为 2 reason
满足 _._4 > 30
,所以我会 return List[(19, "March")]
。
我不知道如何在不使用 groupBy
的情况下解决这个问题,因为这意味着我必须每天 "remember" 将我的当前状态转换为我已经看过的状态。而且我无法保持理解状态。
第 2 部分将去除第 1 部分的糖分,因此不要使用 for-comps,仅使用 map
、flatmap
和 filter
.
抱歉,如果这看起来像一个菜鸟问题,但如果不分组这似乎很荒谬,我只想知道我在这里错过了什么。
reddit 上的一个人帮我解答了。事实证明,您不需要保持状态来满足这个特定要求,只需构建一个 whack 条件即可。我想我考试不及格是有原因的
def moreThanTwoViolations( maxKm: Int,
in: List[(Int, String, String, Int)]
) : List[(Int, String)] = {
(for {
line1 <- data
line2 <- data
if line1._1 == line2._1 &&
line1._2 == line2._2 && // ._1 and ._2 are the date (needs to be different)
line1._3 != line2._3 && // ._3 is the reason. has to be different to add up to 2
line1._4 > maxKm &&
line2._4 > maxKm // both km need to be > maxKm
} yield (line1._1, line1._2)
).distinct
}