Scala聚合函数的示例
我一直在寻找,我找不到一个例子或讨论的集合函数在Scala,我可以理解。它看起来很强大。
这个函数可以用来减少元组的值来创建一个多重映射类型的集合吗?例如: val list = Seq(("one","i"),("two","2"),"ii"),("one","1"),("four","iv")) 应用聚合后: Seq(("one" -> Seq("i","1")),("two" -> Seq("2","ii")),("four" -> Seq("iv")) 另外,你能给出参数z,segop和combop的例子吗?我不清楚这些参数是做什么的。 解决方法
聚合函数不这样做(除了它是一个非常一般的函数,它可以用于这样做)。你想要groupBy。接近至少。当你从一个Seq [(String,String)]开始,并且你通过取得元组中的第一个项(它是(String,String)=> String)分组,它将返回一个Map [String,Seq [ String,String)])。然后,您必须丢弃Seq [String,String]]值中的第一个参数。
所以 list.groupBy(_._1).mapValues(_.map(_._2)) 你可以得到一个Map [String,Seq [(String,String)]。如果您想要一个Seq而不是Map,请在结果中调用Sieq。我不认为你有保证的顺序在所得的Seq,虽然 聚合是一个更困难的功能。 考虑第一个reduceLeft和reduceRight。 仍然,可以有方法reduce,其调用者将负责确保操作是关联的。然后reduce将按顺序调用它认为合适的,可能并行执行它们。事实上,有这样的方法。 然而,对于各种减少方法存在限制。 Seq的元素只能被组合成相同类型的结果:@必须是(A,A)=> A.但是可以有更一般的问题,将它们组合成一个B.一个从类型B的类型b的值开始,并结合它与序列的每个元素。操作符@是(B,A)=> B,并且计算(((b a1)@ a2)… @ an)。 foldLeft这样做。 foldRight做同样的事情,但从一开始。在那里,@操作没有机会成为联想。当一个人写b @ a1 @ a2时,它必须意味着(b @ a1)@ a2,因为(a1 @ a2)将是非类型的。所以foldLeft和foldRight必须是顺序的。 然而,假设每个A都可以变成B,让我们用!,a!是B类型。此外,假设存在操作(B,B)=> B,而@ @这样b @ a其实是一个!不是将元素与@组合,可以首先将它们全部转换为B,然后将它们组合。这将是as.map(!)。reduceLeft()。如果是关联的,那么可以使用reduce来完成,而不是顺序:as.map(!)。reduce()。可能有一个假设的方法as.associativeFold(b,!,)。 聚合非常接近。然而,可能存在更有效的方式来实现b @ a比b a!例如,如果类型B是List [A],并且b @ a是a :: b,则a!将是a :: Nil,b1 b2将是b2 ::: b1。 a :: b比(a :: Nil)::: b更好。为了从结合中受益,但仍然使用@,首先拆分b a1! … an !,into(b a1!ap!)(ap 1!.. an!),然后回到使用@ with(b @ a1 @ an)(ap 1!@ @ an)。还需要一个!在ap 1,因为必须从一些b开始。而且还是必要的,出现在parantheses之间。要做到这一点,as.associativeFold(!,)可以更改为as.optimizedAssociativeFold(b,!,@,)。 回到 。是关联的,或者等价地,(B,)是半群。在实践中,在编程中使用的大多数半群也是单调的,即它们在B中包含中性元素z(对于零),使得对于每个b,z b = b z = b。在这种情况下,!有意义的操作可能是一个! = z @ a。此外,由于z是中性元素b @ a1 .. @ an =(b z)@ a1 @ an,其为b(z a1 @ an)。总是可以用z开始聚合。如果b是想要的,你会在结束时做出结果。有了所有这些假设,我们可以做as.aggregate(z,@,)。这是聚合做的。 @是seqop参数(以序列z @ a1 @ a2 @ ap应用),并且是combop(应用于已经部分组合的结果,如在(z a1 @ … @ ap)(z ap 1 @ … @一个))。 总而言之,as.aggregate(z)(seqop,combop)计算与as.foldLeft(z)(seqop)相同的东西,前提是 (B,combop,z)是一个单体 聚合实现可以使用combop的关联性将计算分组,因为它喜欢(不交换元素,但不能是交换,:::不是)。它可以并行运行它们。 最后,使用聚合方法解决初始问题作为练习留给读者。提示:使用foldLeft实现,然后找到满足上述条件的z和combo。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |