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

如何在scala中拆分和连接字符串?,scala,Scala,我有一个名称字符串,它是名字和姓氏的组合,我想从NameString创建一个新字符串来交换名字和姓氏以创建ReverseNameString。比如说, First Name Last Name NameString ReverseNameString John Kennedy John Kennedy Kennedy John Mary B H Kennedy Mary B H Kennedy Kenne

我有一个名称字符串,它是名字和姓氏的组合,我想从
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
来获取姓氏,但我不知道如何获取姓氏的其余部分来连接这两者。任何帮助都将不胜感激。

实现这一点的方法有很多。一个例子是:

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)

代码运行于。

可以使用str.split(分隔符)str.substring(开始、结束)从较大的字符串中提取较小的字符串。串联就是str1+str2

在这里使用空格作为分隔符是非常不可靠的。例如,我可以根据第一行决定在第五个字符后拆分,因此第二列将是
Name
,空字符串,
bh
,而不是
Last Name
Kennedy
Kennedy

要么预先定义每个列的固定长度,然后可以使用
子字符串
,要么必须设计某种算法,通过对整个输入进行一次扫描来查找所有新的候选列,然后在此基础上将行拆分为列,这仍然不能保证良好的结果。您还可以有一个可能的列名的硬编码列表,使用regexp来检测每个列名的起始位置,并使用它来中断以下字符串


我不想在这里写一个完整的算法,因为我以前认为这是招聘任务,所以我担心在这里有这个答案会鼓励作弊。

有很多方法。我使用
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)
    }
  }
}

last
为您提供集合中的最后一个元素,
init
为您提供集合中除最后一个元素以外的所有元素。“…可以是名字中的多个单词,但不能是姓氏。”在现实世界中不适用,例如Eddie Van Halen
original: John Kennedy
original: Mary B H Kennedy
result: Kennedy John 
result: Kennedy Mary B H