2012-11-28 81 views
8

如果我有短语“纽约市”,我怎样才能得到每个单词的第一个字母?我的谷歌搜索仅向我展示了如何将每个单词中的第一个字母大写,这与我正在尝试做的看似不同。由于我对Scala的知识有限,我可能会在程序上做到这一点,但我希望有人能够在我身上释放一些Scala知识,并向我展示一个描述此问题的函数式方法的示例。如何获得scala中每个单词的第一个字母?

回答

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

+3

' “纽约市” .split( “\\ S +”)。图(_。头)。mkString'没有'Option'就完成了同样的目标。 – dhg

+2

@dhg ...但在空字符串上失败。 – Debilski

+0

你可以过滤掉空的结果,仅保留有效的,这将允许您使用'_.head'方法:'“纽约市” .split(”“).filterNot(_的isEmpty).MAP(_ .head).mkString' –

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

这通过分割“”成单词的数组。然后,我们映射到该数组,并调用String.head获取第一个字符。

5
"New York City".split(" ").toList.map(_(0)) 

给人的字符:

List[Char] = List(N, Y, C) 

如果你想有一个字符串中使用mkStringList[Char]

"New York City".split(" ").toList.map(_(0)) mkString 

获得:

String = NYC 
4
"New York City".split(" ").map(_.charAt(0)) 

会给你一个字符数组

2

下面就以替代使用分裂(正则表达式)。

这里的技巧是使用zip来允许在遍历字符串时在同一个 迭代中测试当前字符和前一个字符,字边界由任何以非字母开头的字母组成。

两个特殊情况下,第一和最后一个字母,通过1处理)前面加上到其还设置了用于拉链 所需的1个字符的歪斜字符串的备份的空间和2)拉链截断部分对。

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) 
相关问题