- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想了解如何foldLeft
适用于 map 。如果我有一个 List 并使用零元素和一个函数调用它 foldLeft ,我确实理解它是如何工作的:
val list1 = List(1,2,3)
list1.foldLeft(0)((a,b) => a + b)
0
与
list1
的第一个元素然后添加
list1
的第二个元素等等。所以输出成为新的输入,第一个输入是零元素。
val map1 = Map(1 -> 2.0, 3 -> 4.0, 5 -> 6.2) withDefaultValue 0.0
val map2 = Map(0 -> 3.0, 3 -> 7.0) withDefaultValue 0.0
def myfct(terms: Map[Int, Double], term: (Int, Double)): Map[Int, Double] = ???
map1.foldLeft(map2)(myfct)
Tuple2
,但由于 map2
是 Map
而不是 Tuple2
,什么是零元素? List
,即 list1
,我们总是“在 list1
中取下一个元素”。 map1
中的“下一个元素”是什么?是另一对 map1
吗?最佳答案
在这种情况下,您可以想到 Map
作为元组列表。您可以创建这样的列表:List(1 -> 2.0, 3 -> 4.0, 5 -> 6.2)
, 并调用 foldLeft
在它上面(这或多或少正是 Map.foldLeft
所做的)。如果您了解如何foldLeft
适用于列表,那么现在您也知道它如何与 Maps 一起使用了 :)
要回答您的具体问题:
foldLeft
的第一个参数可以是任何类型。您可以传入 Map
而不是 Int
在你的第一个例子中也是如此。它不必与您正在处理的集合元素的类型相同(尽管它可能是),就像您在第一个示例中所做的那样,也不必与集合本身的类型相同,因为您在最后一个例子中有它。 List(1,2,3,4,5,6).foldLeft(Map.empty[String,Int]) { case(map,elem) =>
map + (elem.toString -> elem)
}
list.map { x => x.toString -> x }.toMap
相同的结果.如您所见,这里的第一个参数是
Map
,这两者都不是
List
也不是
Int
.
foldLeft
的类型也是它返回的类型,以及你传入的函数返回的类型。它不是“元素零”。
foldLeft
将该参数与列表的第一个元素一起传递给您的 reducer 函数。您的函数将组合这两个元素,并生成与第一个参数相同类型的新值。该值再次传入,再次与第二个元素......等。
foldLeft
的签名会有所帮助:
foldLeft[B](z: B)(op: (B, A) ⇒ B): B
这里
A
是你的集合元素的类型,
B
可以是任何东西,唯一的要求是它出现的四个地方的类型相同。
list.mkString(",")
:
List(1,2,3,4,5,6).foldLeft("") {
case("", i) => i.toString
case(s,i) => s + "," + i
}
Map("one" -> 1, "two" -> 2, "three" -> 3)
.foldLeft("") {
case("", (key,value)) => key + "->" + value
case(s, (key,value)) => s + ", " + key + "->" + value
}
关于scala - 用 Map 而不是 List 理解 foldLeft,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37070203/
假设我们有 Seq val ourSeq = Seq(10,5,3,5,4)。 我想返回一个新的列表,它从左边读取并在看到重复的数字时停止(例如 Seq(10,5,3) 因为 5 是重复的)。 我正在
如何在 Scala 中模拟以下行为?即在满足蓄能器的某些特定条件时继续折叠。 def foldLeftWhile[B](z: B, p: B => Boolean)(op: (B, A) => B):
我目前正在学习 Scala,但还有很多我不明白的东西...... 所以,当出现一个疯狂的答案时,我正在随机浏览一些堆栈溢出:https://stackoverflow.com/a/19093282/3
我有以下代码片段: import scala.io.Source object test extends App { val lineIterator = Source.fromFile("tes
在我的代码中,我有以下内容: type Occurrences = List[(Char, Int)] def subtract(x: Occurrences, y: Occurrences)
我正在尝试使用 Shapeless 中的 HList。 这是我的第一次尝试: trait Column[T] { val name: String } case class CV[T](co
我有这样的 Scala 代码 var i = 1 for(e (i+1)*array(i)).sum (或者稍微快一点,因为您可以随时创建中间体: array.indices.iterator.ma
所以在阅读中this question有人指出,不是程序代码: def expand(exp: String, replacements: Traversable[(String, String)])
我有一个 spark 数据框,我想使用 foldLeft(或任何其他方法)将聚合函数应用于每一列。应用于列的聚合函数将取决于列的数据类型。 请注意,由于我将使用大型数据框,因此我不想使用 .colle
我有一个包含 1 和 -1 的列表。我追求的目标是在总数为 -1 时找到 List 中的位置。 List[Int] = List(1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -
当我省略点符号来应用 foldLeft 时,谁能解释为什么我看到以下编译错误功能?(2.9.2版) scala> val l = List(1, 2, 3) res19: List[Int] = Li
我有一个 List定义为: val l = List("1", "2", "3") 我想把它转换成字符串 "1:2:3" 一种方法如下: l.foldLeft("")((x, y) => x + (i
你如何使用 Map.foldLeft?根据docs看起来像 foldLeft [B] (z: B)(op: (B, (A, B)) ⇒ B) : B 但我有困难: Map("first"->1,"se
我试图了解fold和foldLeft以及各自的reduce和reduceLeft如何工作。我使用 Fold 和 FoldLeft 作为示例 scala> val r = List((ArrayBuff
好吧,我认为这很容易,尝试练习 Scala 的集合运算符,我的示例是一个点列表。 该类可以计算并返回到另一点的距离( double )。 但是,向左折叠似乎不是正确的解决方案 - 考虑元素 e1、e2
谁能解释为什么我在应用 foldLeft 函数时省略点符号时会看到以下编译错误?(版本 2.9.2) scala> val l = List(1, 2, 3) res19: List[Int] = L
这是来自 Coursera 的类(class),直到现在还没有人能帮助我。以下作品,摘自一次讲座。 object polynomials { class Poly(terms0: Map[Int,
在这段代码中,我试图对两个 Strings 的 xor 值求和: val s1 = "1c0111001f010100061a024b53535009181c"; val s2 = "68697420
使用 foldRight 定义如下 concat 函数可以正确 concat list def concat[T](xs: List[T], ys: List[T]): List[T] = (xs f
在一个在线类(class)中,有人说 foldLeft和 foldRight等效于 的运算符结合和交换 . 其中一名学生坚持认为此类运算符只需要具有关联性。所以这个属性对于函数组合和矩阵乘法等操作应该
我是一名优秀的程序员,十分优秀!