我从朋友处获得了部分代码,我正在尝试理解它并以其他方式编写代码."gotowe"是("2011-12-22",-600.00)元素的排序列表
val wartosci = gotowe.foldLeft (List(initial_ballance)){
case ((h::t), x) => (x._2 + h)::h::t
case _ => Nil
}.reverse
Run Code Online (Sandbox Code Playgroud)
这很好,但是如何使用foldLeft?(我已经把所有额外的必要线):
val max = wartosci.max
val min = wartosci.min
val wychylenie = if(math.abs(min)>max){math.abs(min)}else{max}
def scale(x: Double) =
(x / wychylenie) * 500
def point(x: Double) =
{val z:Int = (500 - x).toInt
z}
val (points, _) = wartosci.foldLeft(("", 1)){case ((a, i), h) => (a + " " + (i * 4) + "," + point(scale(h)), i + 1)}
Run Code Online (Sandbox Code Playgroud)
当我打印点数时,我有一个值列表,并且不知道为什么不像值对
这里有几个概念在起作用,我们将依次检查这些概念以确定正在发生的事情:
我们先来看看foldLeft的定义:
def foldLeft [B](z:B)(f:(B,A)⇒B):B
将二元运算符应用于起始值以及此列表的所有元素,从左到右.
返回在此列表的连续元素之间插入op的结果,从左到右,左边是起始值z:op(... op(z,x1),x2,...,xn)其中x1,. ..,xn是此列表的元素.
因此,在您的示例中,我们将获取Tuple2 [String,Float](或类似的东西)的列表,并将其折叠为值z,在本例中是一个包含一个元素的List initial_balance.
现在,我们f在这种情况下是大括号内的代码.它使用模式匹配从组合中组成部分函数(b,a)- 在这种情况下b是'累积结果'并且a是列表中的下一个项目.这是折叠的关键所在 - 它将列表折叠成一个值,使用特定的规则来管理如何一次添加每个元素.
什么是模式匹配/部分功能?模式匹配是一种非常强大的技术,用于从输入数据中调节和提取事物.我们给它一些东西 - case表达的一部分 - 然后告诉它如何处理它=>.这样做的好处是case表达式不仅仅匹配数字或特定字符串,就像java中的switch语句一样,但可以匹配,例如,某个长度的列表,或电子邮件地址或特定元组.更重要的是,您可以使用它来自动获取匹配的某些部分 - 电子邮件地址的域名,列表的第三个元素等.
我们来看看第一种模式:
case ((h::t), x) => (x._2 + h)::h::t
左侧(在此之前=>)用于匹配我们正在寻找的值并提取我们关心的特定部分.在这种情况下,我们正在寻找一个元组,其中第一个元素是由head(h)和tail(t)组成的列表,第二个元素只是列表的下一个元素.它h::t是一个提取器模式 - 它匹配对象::(h,t),它List通过预先添加h到现有Listt 来构造a .
当我们匹配时,我们按照右边的说明=>折叠x成累积值.为此,我们采用日期/值元组(._2)的右侧,将其添加到列表中的最后一个值(头部),然后将其自身推送到列表的头部.你会注意到它使用了我们在模式匹配中使用的相同语法 - 用于::将元素添加到a List.
在这种情况下的效果是创建正在进行的运行总计.
第二种情况并没有真正起作用 - 它是一个捕获所有情况,但由于这是在折叠中使用它永远不应该被调用 - 我们总是会返回看起来像的东西((h::t), x).
最后,我们扭转了整个事情!所以我们留下的是每笔交易后的余额清单,从最老到最年轻.
| 归档时间: |
|
| 查看次数: |
235 次 |
| 最近记录: |