您好我想找出一种方法,将每个名字的前两个字母放在一个向量中,并生成一个字符串,其中包含列表中所有前两个字母的组合。
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',但事实上我需要这样做表明我正在使用错误的操作。
答案 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