Группировка с Scala для понимания - PullRequest
0 голосов
/ 19 апреля 2020

Я недавно провалил экзамен, и одной из основных задач была задача, в которой мне приходилось использовать «для понимания» или, вернее, ТОЛЬКО для понимания.

Данные: 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 s выполнить _._4 > 30, поэтому я бы вернул List[(19, "March")].

Я не понимаю, как решить эту проблему без использования groupBy, потому что это означает, что я Мне нужно было «запомнить» день, чтобы привести мое текущее состояние в состояние, на которое я уже смотрел. И я не могу сохранить состояние с помощью for-comp понимания (

), часть 2 этого состоит в удалении сахара из части 1, поэтому вместо for-comps используйте только map, flatmap и filter.

Извините, если это похоже на вопрос нуба, но без группировки это кажется смешным, и я просто хочу знать, что я здесь упустил.

1 Ответ

2 голосов
/ 20 апреля 2020

Парень из Reddit помог мне с ответом. Оказывается, вам не нужно сохранять состояние, чтобы выполнить это заданное c требование, просто создайте условный удар. Я думаю, что я провалил этот экзамен по причине

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
}

...