首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用foldLeft求和

用foldLeft求和
EN

Stack Overflow用户
提问于 2016-10-20 11:56:31
回答 2查看 1.6K关注 0票数 4

在这段代码中,我试图对两个String的xor值进行求和:

代码语言:javascript
复制
val s1 = "1c0111001f010100061a024b53535009181c";
val s2 = "686974207468652062756c6c277320657965";
val zs : IndexedSeq[(Char, Char)] = s1.zip(s2);
zs.foldLeft(0)((a , b) => (a._1 ^ a._2) + (b._1 ^ b._2))

我收到错误消息:

代码语言:javascript
复制
value _1 is not a member of Int
[error]         zs.foldLeft(0)((a , b) => (a._1 ^ a._2) + (b._1 ^ b._2))
[error]                                      ^
[error] one error found
[error] (test:compileIncremental) Compilation failed
[error] Total time: 2 s, completed Oct 20, 2016 12:51:11 PM

当我在(Char, Char)上折叠时,对应值的xor求和是否有效?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-20 12:14:33

问题是a不是Tuple。如果对传递给foldLeft的函数进行注释,就会发现问题所在:

代码语言:javascript
复制
val s1 = "1c0111001f010100061a024b53535009181c";
val s2 = "686974207468652062756c6c277320657965";
val zs : IndexedSeq[(Char, Char)] = s1.zip(s2);
val sum = zs.foldLeft(0)((a: Int , b: (Char, Char)) => a + (b._1 ^ b._2))

请记住,a是累加器,b是当前值。您希望积累Int,因此a必须与您指定的种子(0)具有相同的类型。

当然,您可以在没有显式注释的情况下编写上面的内容:

代码语言:javascript
复制
zs.foldLeft(0)((a, b) => a + (b._1 ^ b._2))

一种更简单的方法是事先将其映射到Int,然后使用sum函数:

代码语言:javascript
复制
val sum = s1.zip(s2)
  .map(cs => cs._1 ^ cs._2)
  .sum
票数 3
EN

Stack Overflow用户

发布于 2016-10-20 12:17:38

代码语言:javascript
复制
zs.foldLeft(0)((a , b) => a + (b._1 ^ b._2))

试试看

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40153750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档