如果我有短语“纽约市”,我如何获得每个单词的第一个字母?我的谷歌搜索只向我展示了如何将每个单词的第一个字母大写,这似乎与我想要做的不同。
鉴于我对 Scala 的了解有限,我可能可以通过程序来执行此操作,但我希望有人可以向我介绍一些 Scala 知识,并向我展示一个描述此问题的函数式方法的示例。
如果我有短语“纽约市”,我如何获得每个单词的第一个字母?我的谷歌搜索只向我展示了如何将每个单词的第一个字母大写,这似乎与我想要做的不同。
鉴于我对 Scala 的了解有限,我可能可以通过程序来执行此操作,但我希望有人可以向我介绍一些 Scala 知识,并向我展示一个描述此问题的函数式方法的示例。
所有其他版本都可以正常工作,但为了避免格式错误的字符串(连续两个空格,空字符串)失败,请使用
"New York City".split(" ").flatMap(_.headOption).mkString
这也适用于
"New York City".split(" ").flatMap(_.headOption).mkString
甚至
"".split(" ").flatMap(_.headOption).mkString
正如dhg所建议的那样,人们可能还想使用更合适的正则表达式"\\s+"
。但是,人们不妨使用更合适的东西:
"""\w+""".r.findAllIn("New York City").map(_.head).mkString
(在这里/\w+/
应该希望我们能免于病理病例,这样我们就可以使用这个.head
版本。)
scala> "New York City".split(" ").map(_.head).mkString
res5: String = NYC
这被“”分割成一个单词数组。然后我们映射该数组并调用 String.head 来获取第一个字符。
"New York City".split(" ").toList.map(_(0))
给出字符:
List[Char] = List(N, Y, C)
如果你想要一个字符串mkString
使用List[Char]
:
"New York City".split(" ").toList.map(_(0)) mkString
要得到:
String = NYC
"New York City".split(" ").map(_.charAt(0))
会给你一个char数组
这是使用拆分(正则表达式)的替代方法。
这里的技巧是使用 zip 允许在遍历字符串的同一迭代中测试当前和前一个字符,单词边界由前面有一个非字母的任何字母组成。
两种特殊情况,第一个和最后一个字母,通过 1) 在字符串的副本前添加一个空格来处理,这也设置了 zip 所需的 1 个字符倾斜和 2) zip 截断部分对。
val s = "\n1New\n\t \t \tYork --City\n\t"
def firstLetters(s: String) = {
" "+s zip s collect {case (w, c) if ! w.isLetter && c.isLetter => c}
}
firstLetters(s)
返回
Vector(N, Y, C)