我有一个特定类型的列表,我想根据条件减少它。我有一种类型,其中 Interval 是具有开始和结束的日期时间间隔:
case class MyType(a: Interval, value: Double)
Run Code Online (Sandbox Code Playgroud)
我有一个 List[MyType] 条目,我想将其缩减为基于包含相同日期时间和值的 MyType 的 List[MyType] 。我不想再重复一遍这份清单,虽然我已经这么做了。
假设我有:
val a = MyType(interval1, 2)
val b = MyType(interval2, 2)
val c = MyType(interval3, 1)
val d = MyType(interval4, 6)
val e = MyType(interval5, 2)
val original = List(a, b, c, d, e)
Run Code Online (Sandbox Code Playgroud)
我现在必须根据以下条件减少原始列表:
1. interval should be continuous, then take the start of the first entry and the end of the second entry
2. the double value should be the same
Run Code Online (Sandbox Code Playgroud)
因此假设interval1、interval2是连续的,结果应该是这样的:
val result = Seq(MyType(new Interval(a.interval.start, b.interval.end),2), c, d, e)
Run Code Online (Sandbox Code Playgroud)
有更优雅的解决方案或想法吗?
在reduce 函数中,检查条件是否为真,如果为真,则返回当前累加器,而不是您原本要计算的累加器。
以下是仅对偶数求和的方法:
Seq(1,4,6,3).foldLeft(0)( (acc, a) =>
if (a % 2 == 0) acc + a else acc
)
res5: Int = 10
Run Code Online (Sandbox Code Playgroud)
对编辑后的问题的回应:看来您有一些关于连续元素的条件。然后就可以应用该功能了.sliding。
Seq(a,b,c,d,e).sliding(2).foldLeft(0)(
case (acc, Seq(MyType(ai, a), MyType(bi, b))) =>
if (ai.max == bi.min) acc + a else acc
)
Run Code Online (Sandbox Code Playgroud)
但是...您可能已经猜到它的性能不会像您想要的那样。我希望你不要做任何过早的优化,因为你知道,这是万恶之源。但如果您确实需要性能,请根据while循环重写代码(回退到 Java)。