Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在scala中获得每个单词的第一个字母?_Scala - Fatal编程技术网

如何在scala中获得每个单词的第一个字母?

如何在scala中获得每个单词的第一个字母?,scala,Scala,如果我有“纽约市”这个短语,我如何得到每个单词的第一个字母?我的谷歌搜索只向我展示了如何大写每个单词的第一个字母,这似乎与我正在尝试的有所不同 考虑到我对Scala的知识有限,我可能可以按程序完成这项工作,但我希望有人能向我传授一些Scala知识,并向我展示一个描述解决此问题的函数方法的示例 scala> "New York City".split(" ").map(_.head).mkString res5: String = NYC 它按“”拆分为一个单词数组。然后我们映射到该数组,

如果我有“纽约市”这个短语,我如何得到每个单词的第一个字母?我的谷歌搜索只向我展示了如何大写每个单词的第一个字母,这似乎与我正在尝试的有所不同

考虑到我对Scala的知识有限,我可能可以按程序完成这项工作,但我希望有人能向我传授一些Scala知识,并向我展示一个描述解决此问题的函数方法的示例

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)