如何在scala中获得每个单词的第一个字母?
如果我有“纽约市”这个短语,我如何得到每个单词的第一个字母?我的谷歌搜索只向我展示了如何大写每个单词的第一个字母,这似乎与我正在尝试的有所不同 考虑到我对Scala的知识有限,我可能可以按程序完成这项工作,但我希望有人能向我传授一些Scala知识,并向我展示一个描述解决此问题的函数方法的示例如何在scala中获得每个单词的第一个字母?,scala,Scala,如果我有“纽约市”这个短语,我如何得到每个单词的第一个字母?我的谷歌搜索只向我展示了如何大写每个单词的第一个字母,这似乎与我正在尝试的有所不同 考虑到我对Scala的知识有限,我可能可以按程序完成这项工作,但我希望有人能向我传授一些Scala知识,并向我展示一个描述解决此问题的函数方法的示例 scala> "New York City".split(" ").map(_.head).mkString res5: String = NYC 它按“”拆分为一个单词数组。然后我们映射到该数组,
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)
如果需要字符串,请使用列表[Char]
上的mkString
:
"New York City".split(" ").toList.map(_(0)) mkString
要获得:
String = NYC
将为您提供一个字符数组所有其他版本都可以正常工作,但为了避免格式错误的字符串(一行两个空格,空字符串)出现故障,请使用 这也适用于
"New York City".split(" ").flatMap(_.headOption).mkString
甚至
"".split(" ").flatMap(_.headOption).mkString
正如所建议的,可能还需要使用更合适的正则表达式,例如“\\s+”
。但是,我们不妨使用更合适的方法:
"""\w+""".r.findAllIn("New York City").map(_.head).mkString
(在这里,
/\w+/
有望使我们免于病理病例,因此我们可以使用.head
版本。)这里有一个替代使用split(Regex)的方法
这里的诀窍是使用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)
“New York City”.split(\\s+).map(
在没有选项的情况下实现相同的目标,但在空字符串上失败。您可以过滤掉空结果,只保留有效结果,这将允许您使用.head
方法:“New York City”.split(“.filterNot(\ucode.isEmpty).map(.head).mkString
事实上,我昨天刚刚遇到了双空格的问题。很高兴我回来看到了这一切。非常感谢。
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)