如何在scala中分割和连接字符串?



我有一个NameString,它是名字和姓氏的组合,我想从NameString创建一个新的字符串来交换名字和姓氏来创建ReverseNameString。例如,

First Name   Last Name    NameString          ReverseNameString
John         Kennedy      John Kennedy        Kennedy John
Mary B H     Kennedy      Mary B H Kennedy    Kennedy Mary B H

我如何使用scala做到这一点?请注意,名字中可以有多个单词,但姓氏中不能有。

我已经使用NameString.split(" ").last来获得姓氏,但我不确定如何获得其余的名字来连接这些两者。如有任何帮助,不胜感激。

可以使用str.split(separator)str.substring(start, end)从较大的字符串中提取较小的字符串。连接只是str1 + str2.

在这里使用空格作为分隔符是非常不可靠的。例如,我可以决定在基于第一行的第5个字符之后分割,因此第二列将是Name,空字符串,B H而不是Last Name,Kennedy,Kennedy

要么你预定义了每个列的固定长度,然后你可以使用substring,要么你必须设计一些算法,通过一次扫描整个输入来找到所有新的候选列,然后在此基础上将行分成列,这仍然不能保证好的结果。您还可以拥有一个可能的列名的硬编码列表,使用regexp来检测每个列名的开始位置,并使用该列表来分隔下面的字符串。

我不想在这里写一个完整的算法,因为我之前把它看作是招聘作业,所以我担心在这里给出这个答案会鼓励作弊。

有很多方法可以做到这一点。一个例子是:

def reverseName(name: String): String = {
val names = name.split(' ')
(names.last +: names.dropRight(1)).mkString(" ")
}

然后调用:

val names = Seq("John Kennedy", "Mary B H Kennedy")
println(names.map(reverseName))

将输出:

List(Kennedy John, Kennedy Mary B H)

在Scastie上运行的代码。

有很多方法。我使用yield来连接所有的名字。这个答案只是你的另一个选择。

object BasicString {
def main(args: Array[String]): Unit = {
val nameStringList = List("John Kennedy", "Mary B H Kennedy")
nameStringList.foreach(s => println(s"original: $s"))
val result = reverseNames(nameStringList)
result.foreach(s => println(s"result: $s"))
}
def reverseNames(nameStringList: List[String]): List[String] = {
nameStringList.map { name =>
val nameArray = name.split(" ")
val firstsName = for {i <- 0 until nameArray.length - 1} yield (nameArray(i) + " ")
(nameArray(nameArray.length - 1) + " " + firstsName.mkString)
}
}
}

输出:

original: John Kennedy
original: Mary B H Kennedy
result: Kennedy John 
result: Kennedy Mary B H 

最新更新