作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 Scala 应用程序,并试图以一种功能方式遍历一个表(以二维数组的形式)。对于表中的每一行,我想用第一列中的所有不同值填充一个集合,并用第二列中的所有不同值填充第二个集合。
我尝试了很多方法,但找不到任何解决方案如何以功能风格来做到这一点。因为我从迭代中获得了 2 个新变量,如果没有非功能性帮助,这似乎是不可能的。
这是一个非功能性示例,其中包含用于包含产品和客户的表的可变 HashSet:
val myInputTable =
Array(Array("Product A","Customer 1"), Array("Product B","Customer 1"),
Array("Product C","Customer 2"), Array("Product A","Customer 2"))
val productSet = new collection.mutable.HashSet[String]
val customerSet = new collection.mutable.HashSet[String]
for(
inputLine <- myInputTable;
inputElement <- inputLine
) {
if (inputLine.indexOf(inputElement) == 0) {
productSet.add(inputElement)
} else {
customerSet.add(inputElement)
}
}
println("Product Set:")
productSet.foreach(println)
println("\nCustomer Set:")
customerSet.foreach(println)
最佳答案
任何时候你发现自己试图对一些迭代序列的代码进行 FP-ify,同时更新一些可变状态,一个好的第一种方法是使用 foldLeft
:
val myInputTable =
Array(Array("Product A","Customer 1"), Array("Product B","Customer 1"),
Array("Product C","Customer 2"), Array("Product A","Customer 2"))
val (products, customers) =
myInputTable.foldLeft((Set.empty[String], Set.empty[String])) {
case ((ps, cs), Array(p, c)) => (ps + p, cs + c)
case ((ps, cs), _) => (ps, cs) // Alternatively fail here.
}
foldLeft
的第一个参数是初始状态。我们想要使用两个不可变的集合,所以我们使用了
Set.empty[String]
的元组。 .
foldLeft
的下一个参数这是一个函数:
{
case ((ps, cs), Array(p, c)) => (ps + p, cs + c)
case ((ps, cs), _) => (ps, cs) // Alternatively fail here.
}
(ps, cs)
和每个元素
Array(p, c)
到下一个状态。它将从左到右应用于集合中的每个函数(因此是
foldLeft
),累积状态变化,并返回状态的最终值。它是这样工作的:
scala> val (products, customers) =
| myInputTable.foldLeft((Set.empty[String], Set.empty[String])) {
| case ((ps, cs), Array(p, c)) => (ps + p, cs + c)
| case ((ps, cs), _) => (ps, cs) // Alternatively fail here.
| }
products: scala.collection.immutable.Set[String] = Set(Product A, Product B, Product C)
customers: scala.collection.immutable.Set[String] = Set(Customer 1, Customer 2)
foldLeft
是一个很好的通用起点,它允许从可变代码到纯函数代码的相当简单的转换。
关于scala - 在 Scala 中以函数方式迭代表填充 2 个 HasSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54970751/
我正在编写一个 Scala 应用程序,并试图以一种功能方式遍历一个表(以二维数组的形式)。对于表中的每一行,我想用第一列中的所有不同值填充一个集合,并用第二列中的所有不同值填充第二个集合。 我尝试了很
我是一名优秀的程序员,十分优秀!