object MergeRangesApp {
def mergeRanges(ranges: List[(Int, Int)]): List[(Int, Int)] = {
val sorted = ranges.sortBy(_._1)
sorted.foldLeft(List.empty[(Int, Int)]) {
case (Nil, range) =>
List(range)
case (merged @ (lastStart, lastEnd) :: rest, (start, end)) =>
if (start <= lastEnd)
(lastStart, math.max(lastEnd, end)) :: rest
else
(start, end) :: merged
}.reverse
}
def main(args: Array[String]): Unit = {
val ranges = List(
(302, 447),
(488, 489),
(121, 234),
(200, 421),
(140, 354)
)
val merged = mergeRanges(ranges)
println(merged)
}
}
/*
run:
List((121,447), (488,489))
*/