【发布时间】:2020-10-24 02:03:32
【问题描述】:
我有以下序列
scala> var al = Seq((1.0, 20.0, 100.0), (2.0, 30.0, 100.0), (1.0, 11.0, 100.0), (1.0, 20.0, 100.0), (1.0, 10.0, 100.0),(2.0,9.0,100.0))
al: Seq[(Double, Double, Double)] = List((1.0,20.0,100.0), (2.0,30.0,100.0), (1.0,11.0,100.0), (1.0,20.0,100.0), (1.0,10.0,100.0), (2.0,9.0,100.0))
如何从这个 Seq 中获取前 n 个元素,其中 - 第二项的总和大于第三项的 60%(这将是一个常数值)
预期输出 -
scala> Seq((1.0, 20.0, 100.0), (2.0, 30.0, 100.0), (1.0, 11.0, 100.0))
res30: Seq[(Double, Double, Double)] = List((1.0,20.0,100.0), (2.0,30.0,100.0), (1.0,11.0,100.0))
编辑 -1
我用一些丑陋的方式做到了这一点。但是,如果有任何漂亮的功能性方法来解决这个问题,那就太好了。我真的需要摆脱这个计数器,对我来说有点棘手。
var counter =0d ; var sum = 0d
var abc :Seq[Double] = for (x <- al) yield {
counter+=1 ;sum = sum + x._2 ;
if (sum > 60) counter else 0
}
println(al.take(abc.filterNot(_==0).min.toInt))
【问题讨论】:
-
你试过什么?什么不起作用?
-
查看
takeWhile方法:scala-lang.org/api/2.12.3/scala/collection/Seq.html 它可以根据需要工作 -
@Jean-PhilippePellet ,我在学习解决问题的实用方法时尝试了一些丑陋的东西。这个 >>> var counter =0d ; var sum = 0d var abc :Seq[Double] = for (x 60) counter else 0} println(al.take(abc.filterNot(_==0).min.toInt))
-
@Boris。我正在尝试我上面提到的东西。但我没有正确连接。
标签: arrays scala arraylist seq take