Scala 列表操作

标签 scala

给定一个 Int 列表和 Int 类型的变量 X。 Scala 中最好的功能方法是仅保留列表中的那些值(从列表的开头开始),以便列表值的总和小于等于变量。

最佳答案

这非常接近单行:

def takeWhileLessThan(x: Int)(l: List[Int]): List[Int] =
  l.scan(0)(_ + _).tail.zip(l).takeWhile(_._1 <= x).map(_._2)

让我们把它分解成更小的部分。

首先,您使用scan 创建一个累积和列表。以下是它在一个小示例中的工作原理:

scala> List(1, 2, 3, 4).scan(0)(_ + _)
res0: List[Int] = List(0, 1, 3, 6, 10)

请注意,结果包括初始值,这就是我们在实现中采用 tail 的原因。

scala> List(1, 2, 3, 4).scan(0)(_ + _).tail
res1: List[Int] = List(1, 3, 6, 10)

现在我们将整个内容压缩到原始列表中。再次以我们的示例为例,如下所示:

scala> List(1, 2, 3, 4).scan(0)(_ + _).tail.zip(List(1, 2, 3, 4))
res2: List[(Int, Int)] = List((1,1), (3,2), (6,3), (10,4))

现在我们可以使用 takeWhile 在累积和大于我们的目标之前从这个列表中获取尽可能多的值。假设我们的示例中的目标是 5:

scala> res2.takeWhile(_._1 <= 5)
res3: List[(Int, Int)] = List((1,1), (3,2))

这几乎就是我们想要的——我们只需要去掉累积和:

scala> res2.takeWhile(_._1 <= 5).map(_._2)
res4: List[Int] = List(1, 2)

我们完成了。值得注意的是,这不是很有效,因为它计算了整个列表的累积总和等。可以通过多种方式优化实现,但就目前而言,它可能是在 Scala 中执行此操作的最简单的纯函数式方法(无论如何,在大多数情况下,性能不会成为问题)。

关于Scala 列表操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30786398/

相关文章:

scala - SPARK 数据帧错误 : cannot be cast to scala. Function2,同时使用 UDF 拆分列中的字符串

scala - 如何修复 Scala (Akka 2.4.0) 中被逐出的库和不明确的引用错误?

java - 斯卡拉/Mockito : How to mock the result of a method called inside another method?

scala - 在scala中交换两个变量

scala:如何在自己的构造函数中获取类

scala - ClassNotFoundException : scala. 函数 1$mcLL$sp

postgresql - 在 Bluemix Apache-Spark 服务上运行的 Spark 应用程序中连接到 postgresql 数据库

scala - 使用 spark 仅列出文件夹中的文件名

scala - Spark Collect_list 并限制结果列表

scala - 使用 SBT 离线解决 org.apache.hadoop 依赖性的错误