Вот один подход, использующий foldLeft
с аккумулятором типа Tuple, переносящим текущий строковый элемент для проверки на равенство на следующей итерации, за которым следует grouped
для окончательного преобразования:
val list = List(
("taskENTER_CRITICAL", 1443),
("taskEXIT_CRITICAL", 1492),
("taskEXIT_CRITICAL", 1510),
("taskEXIT_CRITICAL", 1528),
("taskENTER_CRITICAL", 1551),
("taskEXIT_CRITICAL", 1555),
("taskENTER_CRITICAL", 1602),
("taskEXIT_CRITICAL", 1614)
)
val list2 = list.foldLeft( (List[(String, Int)](), "") ){
case ((l, sp), (s, i)) => s match {
case "taskENTER_CRITICAL" => ((s, i) :: l, s)
case "taskEXIT_CRITICAL" if s == sp => ((s, i) :: l.tail, s)
case _ => ((s, i) :: l, s)
}
}._1.reverse
// list2: List[(String, Int)] = List(
// (taskENTER_CRITICAL,1443), (taskEXIT_CRITICAL,1528),
// (taskENTER_CRITICAL,1551), (taskEXIT_CRITICAL,1555),
// (taskENTER_CRITICAL,1602), (taskEXIT_CRITICAL,1614)
// )
list2.grouped(2).collect{ case List(a, b) => ("CS", a._2, b._2) }.toList
// res2: List[(String, Int, Int)] = List((CS,1443,1528), (CS,1551,1555), (CS,1602,1614))
Обратите внимание, что обращение элементов списка необходимо после foldLeft
, так как список собирается в обратном порядке с ::
и tail
для производительности в масштабе.