【发布时间】:2014-02-26 00:00:22
【问题描述】:
假设我有一个按第一个元素排序的对列表,看起来像这样:
List((0.0,0.001), (0.001,1.0), (1.0,2.0), (2.0,3.0), (3.0,4.0), (4.0,5.0), (5.0,15.0), (15.0,30.0), (30.0,45.0), (45.0,60.0), (60.0,71.0))
这本质上是一个区间列表。
给定一个起始元素,例如对应于(2.0,3.0) 的元素3,以及一个区间长度,例如40,如果我从索引开始,我想找到40 结束的区间索引3.
所以本质上,对于从(在这种情况下)元素 3 开始的每个元素,我需要执行 _._2 - _._1 并将它们相加,直到长度超过 40。一旦我到达它,我需要停止。我不想map整个列表到持续时间(列表可能很长),无论如何我不想foldLeft所有这些,我想在达到所需的持续时间后立即停止.它类似于传统命令式for 循环的break。
如果您要使用普通的旧 Java 命令式地执行此操作,这将非常简单。有没有什么聪明的技巧可以在 Scala 中以函数式的方式做到这一点?
【问题讨论】:
-
我鼓励你为间隔类型创建一个真正的抽象。元组是弱抽象,例如映射、数组和集合等等。
-
好吧,我可以创建一个
Interval案例类,它提供一个计算持续时间的val。我还可以使用仅包含每对的第一个数字的更简单列表,因为第二个数字与下一对的第一个数字相同(在我的情况下我没有空白),但基本上我所拥有的信息没有改变那么多,我的问题是如何foldLeft(或以某种方式累积)列表的一部分,直到我达到某个标准,并且知道遍历了多少元素才能达到它