在开始和结束时间的元组列表中查找空间隔的功能方法

时间:2016-05-31 15:18:57

标签: scala functional-programming

假设我有一个包含开始和结束时间的元组列表:

List((1,10), (2,11), (3,11), (13,14))

唯一的放松是开始时间是提升

我期待以下输出:

List((0,1), (11,13))

程序实现相当简单,但我不知道这个(惯用)功能。

scala-for-yield循环似乎不合适,因为结果与输入的大小相同。而减少/折叠会限制我只有一个元组作为答案。

2 个答案:

答案 0 :(得分:5)

考虑以下解决方案:

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

答案 1 :(得分:0)

您可以结合使用scanLeft过滤器和地图

list.scanLeft((0,0,0))((l,r) => 
  if(r._1 > l._3) {(l._2, r._1, r._2)} 
  else {(l._1,r._2, r._2)}) 
filter(x => x._2 != x._3) 
map(x => (x._1, x._2))

在扫描过程中,我们会查看扫描对的右侧元素,即作业,以查看它是否大于到目前为止的结束时间(以(0,0,0)三元组启动) 。如果是这样,我们输出一个三元组,按顺序包含

  1. 差距的开始
  2. 差距的结束
  3. 结束差距的工作停止时间。
  4. 如果右手,即工作的开始时间不大于左手的结束时间,则没有空隙,我们创建一个三元组,扩大了

    ,目前的工作条件(缺乏更好的术语)
    1. 复制job-streak的开始时间
    2. 复制上一份工作的结束时间
    3. 与2相同。
    4. 我们现在可以通过看到三元组的第二个和第三个元素不同来确定间隙(验证这是一个iff关系)。我们现在过滤这个事实。最后我们映射所以我们得到适当的输出形式。