Scala - 使用 Reduce 合并向量中的子字符串

Scala - Combine Substrings from a Vector using Reduce

你好,我正在尝试找出一种方法,将每个名称的前 2 个字母放入向量中,并生成一个由列表中所有前 2 个字母组合而成的字符串。

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',但我需要这样做的事实表明我使用了错误的作业操作。

您确实不能将 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)

使用 map 和 mkString 很简单。例如:

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

可以使用_通配符,substring()替换为take:

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