2012-11-28 112 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) 
相關問題