使用 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,仅使用 mapflatmapfilter.

抱歉,如果这看起来像一个菜鸟问题,但如果不分组这似乎很荒谬,我只想知道我在这里错过了什么。

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
}