【发布时间】:2021-11-26 23:33:59
【问题描述】:
我需要过滤一组对象(已经按属性 A 排序)删除属性 B 乱序的项目(下面用粗体标记): (为简单起见,一组元组)
案例一:
- 输入Seq((10, 10), (20, 20), (30, 36), (40, 30), (50, 40), (60, 50))
- 预期输出:Seq((10, 10), (20, 20), (30, 36), (50, 40), (60, 50))
- 实际输出:Seq((10,10), (20,20), (40,30), (50,40))
案例2:
- 输入:Seq((10, 10), (20, 20), (30, 36), (40, 40), (50, 30), (60, 50))
- 预期输出:Seq((10, 10), (20, 20), (30, 36), (40, 40), (60, 50))
- 实际输出:Seq((10,10), (20,20), (30,36), (50,30))
我将不胜感激。
这是我目前所拥有的:
@RunWith(classOf[SpringRunner])
class OutOfOrderTest extends AnyWordSpec with Matchers with Debuggable {
"OutOfOrderTest" should {
def ooo(a: Seq[(Int, Int)]): Option[(Int, Int)] = {
val x = a.head
val y = a.tail.head
if (x._2 <= y._2) Some(x) else None
}
"filter out of order simple" in {
val bad = Seq((10, 10), (20, 20), (30, 36), (40, 30), (50, 40), (60, 50))
val filtered = bad.sliding(2).collect { a =>
ooo(a)
}.filter(_.isDefined).map(_.get).toSeq
filtered shouldEqual Seq((10, 10), (20, 20), (30, 36), (50, 40), (60, 50))
}
"filter out of order complex" in {
val bad2 = Seq((10, 10), (20, 20), (30, 36), (40, 40), (50, 30), (60, 50))
val filtered2 = bad2.sliding(2).collect { a =>
ooo(a)
}.filter(_.isDefined).map(_.get).toSeq
filtered2 shouldEqual Seq((10, 10), (20, 20), (30, 36), (40, 40), (60, 50))
}
}
}
更新 1
我使用序列来提高性能(可能最好使用数组,但我可以稍后处理)
为简单起见,我在这里使用了元组,但它们实际上是案例类 (Target) 的实例,其中 2 个字段由元组数据表示。
这也是一个更大的 Spring-boot 应用程序中的一个过滤器,我必须用它制作一个组件。
虽然“组件化”(是的,我们在办公室里提出了这个词)过滤器没有问题,但来自@Luis 的递归函数将难以抽象如下:
我想将这三种方法作为组件进行测试 因此,如果可以的话,我会将 3 个答案标记为有效。
case class Target(rt: Double, ri: Double)
trait OutOfOrderRemover {
def filter(targets: Seq[Target])
}
@Component
class RecurtsiveOOO extends OutOfOrderRemover {
override def filter(targets: Seq[Target]): Seq[Target] = { }
}
【问题讨论】:
-
感谢所有 jwvh、Guru 和 Luis 的快速回答,每个人都有我喜欢的东西,jwvh 非常简洁,Guru 使用折叠,Luis 使用递归。
标签: spring-boot scala filtering scala-collections