Scala - 使用Reduce

时间:2015-05-14 22:39:48

标签: function scala collections

您好我想找出一种方法,将每个名字的前两个字母放在一个向量中,并生成一个字符串,其中包含列表中所有前两个字母的组合。

val names: Vector[String] = Vector("June", "Jane", "James", "Iain", "Kate", 
"Beth", "George", "Jack", "Ben", "Bob", "Neil", "Simon")    
val try1 = names.reduceLeft((str1, str2) => str1.substring(0, 2) +
str2.substring(0, 2))
val try2 = names.reduceLeft((str1, str2) => str1 + str2.substring(0, 2))

//try1: String = JuSi - With both substringed
//try2: String = JuneJaJaIaKaBeGeJaBeBoNeSi with only str2 substring

评论显示了各自的结果。 我从我的结果中推测,更改str1会停止迭代(或至少停止它按预期工作)。 我应该在这里做些什么来获得理想的结果?显然我可以从最终结果中删除'n'和'e',但事实上我需要这样做表明我正在使用错误的操作。

2 个答案:

答案 0 :(得分:4)

你确实无法使用reduce来做你所做的事情,因为它使用第一个元素作为聚合器。使用foldLeft

names.foldLeft("")((str1, str2) => str1 + str2.substring(0, 2))

为了帮助您了解正在发生的事情,让我们看一个简单的示例:

val names = Vector("June", "Jane", "James")

使用reduceLeft,您得到:

"June" + "Jane".substring(0, 2) + "James".substring(0, 2)

使用foldLeft,您得到:

"" + "June".substring(0, 2) + "James".substring(0, 2)

答案 1 :(得分:1)

使用map和mkString执行此操作非常简单。例如:

val result = names.map(a => a.substring(0, 2)).mkString

可以使用_通配符,并用take:

替换substring()
val result = names.map(_.take(2)).mkString