如何使用reduce或fold来加密字符串标记列表?

时间:2014-01-21 09:17:34

标签: scala

例如,我想加密句子的每个标记并将它们缩减为最终的加密文本:

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:

5 个答案:

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

请注意,foldreduce将在每个步骤中对两个操作数进行操作。但是,您希望加密每个标记 - 这是一个一元操作数。因此,首先您应该map,然后foldreduce

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)

我认为您的主要问题是reducefold的工作原理。您可以向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) }