例如,我想加密句子的每个标记并将它们缩减为最终的加密文本:
def convert(str: String) = {
str + ":"
}
val tokens = "Hi this is a text".split("\\ ").toList
val reduce = tokens.reduce((a, b) => convert(a) + convert(b))
println(reduce)
// result is `Hi:this::is::a::text:`
val fold = tokens.fold("") {
case (a, b) => convert(a) + convert(b)
}
println(fold)
// result is `:Hi::this::is::a::text:`
val scan = tokens.scan("") {
case (a, b) => convert(a) + convert(b)
}
println(scan)
// result is List(, :Hi:, :Hi::this:, :Hi::this::is:, :Hi::this::is::a:, :Hi::this::is::a::text:)
假设convert是加密函数。因此每个令牌只应加密一次而不是两次。折叠并减少并扫描重新加密加密的令牌。我想要这个期望的结果Hi:this:is:a:text:
答案 0 :(得分:2)
如果您想单独加密每个令牌,那么地图应该可以正常工作。
val tokens = "Hi this is a text".split("\\ ").toList
val encrypted = tokens.map(convert).mkString
println(encrypted) //prints Hi:this:is:a:text:
def convert(str: String) = {
str + ":"
}
编辑:如果你想使用折叠:
val encrypted = tokens.foldLeft("")((result, token) => result + convert(token))
答案 1 :(得分:2)
One-liner专门针对这个例子,
"Hi this is a text" split " " mkString("",":",":")
或者
val tokens = "Hi this is a text" split " "
val sep = ":"
val encrypted = tokens mkString("",sep,sep)
答案 2 :(得分:2)
请注意,fold
或reduce
将在每个步骤中对两个操作数进行操作。但是,您希望加密每个标记 - 这是一个一元操作数。因此,首先您应该map
,然后fold
或reduce
:
tokens map(convert)
缩减/折叠:
scala> tokens.map(convert).fold("")(_ + _)
res10: String = Hi:this:is:a:text:
scala> tokens.map(convert)reduce(_ + _)
res11: String = Hi:this:is:a:text:
事实上,你可以简单地使用mkString
,这使它更简洁:
scala> tokens.map(convert).mkString
res12: String = Hi:this:is:a:text:
您也可以并行进行转换(使用 par ):
scala> tokens.par.map(convert).mkString
res13: String = Hi:this:is:a:text:
scala> tokens.par.map(convert)reduce(_ + _)
res14: String = Hi:this:is:a:text:
答案 3 :(得分:1)
我认为您的主要问题是reduce
和fold
的工作原理。您可以向other answer
关于你的问题,fold
可以提供帮助:
"Hi this is a text".split("\\ ").fold("") { (a, b) => a + convert(b) }
答案 4 :(得分:1)
以下版本已清除代码并删除了不必要的转换:
def convert(str: String) = str + :
val tokens = "Hi this is a text" split " "
val encrypted = (tokens map convert) mkString " "
mkString 可被视为字符串的减少(或折叠)的专用版本。
如果由于某种原因,您不想使用mkString,代码将如下所示:
def convert(str: String) = str + :
val tokens = "Hi this is a text" split " "
val encrypted = (tokens map convert) reduce (_ + _)
或者用折叠缩短
val encrypted = "Hi this is a text".split(" ").foldLeft ("") { case (accum, str) => accum + convert(str) }