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

时间:2012-11-28 23:59:49

标签: scala

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

鉴于我对Scala的了解有限,我可能会在程序上做到这一点,但我希望有人可以向我提供一些Scala知识,并向我展示一个描述这个问题的功能方法的例子。

5 个答案:

答案 0 :(得分:24)

所有其他版本的工作正常但是为了避免格式错误的字符串失败(连续两个空格,空字符串),请使用

"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版本。)

答案 1 :(得分:13)

scala> "New York City".split(" ").map(_.head).mkString
res5: String = NYC

将“”分成一个单词数组。然后我们映射该数组并调用String.head获取第一个字符。

答案 2 :(得分:5)

"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

答案 3 :(得分:4)

"New York City".split(" ").map(_.charAt(0))

会给你一个char数组

答案 4 :(得分:2)

这是使用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)