假设我有一个包含开始和结束时间的元组列表:
List((1,10),(2,11),(3,(13,14))
唯一的放松是开始时间是提升的
我期待以下输出:
List((0,1),(11,13))
程序实现相当简单,但我不知道这个(惯用)功能.
scala-for-yield循环似乎不合适,因为结果与输入的大小相同.而减少/折叠会限制我只有一个元组作为答案.
解决方法
考虑以下解决方案:
list .foldLeft((List[(Int,Int)](),0)) { case ((res,se),(s,e)) => if(s>se) ((se,s)::res,e) else (res,e) } ._1 .reverse
说明.我们累加一对值:空间隔列表(最初为空,List(Int,Int))和最后一个间隔的末尾(最初为0).在每个步骤中取当前间隔(s,e)并将其与最后一个间隔的结束进行比较.如果当前间隔的开始时间大于最后一个,则存在间隙,我们将其结果:(se,s):: res