加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 用foldLeft求和

发布时间:2020-12-16 10:01:10 所属栏目:安全 来源:网络整理
导读:在这段代码中,我试图将两个字符串的xor值相加: 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)
在这段代码中,我试图将两个字符串的xor值相加:

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))

我收到错误消息:

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求和有效吗?

解决方法

问题是a不是元组.如果您注释传递给foldLeft的函数,您应该看到问题:

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是当前值.您希望累积Ints,因此a必须与您指定的种子(0)具有相同的类型.

当然,您可以在没有明确注释的情况下编写上述内容:

zs.foldLeft(0)((a,b) => a + (b._1 ^ b._2))

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

val sum = s1.zip(s2)
  .map(cs => cs._1 ^ cs._2)
  .sum

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读