2012-11-28 17 views
8

「ニューヨーク市」というフレーズがある場合、どのようにして各単語の最初の文字を取得できますか?私のグーグルでは、各単語の最初の文字を大文字にする方法がわかりましたが、これは私がやろうとしているものとは一見違っています。スカラの各単語の最初の文字を取得するにはどうすればよいですか?

Scalaに関する限られた知識があるので、私はこの手順を手続きすることができましたが、私はScalaの知識を私に教えて、この問題に対する機能的なアプローチを示す例を示してくれることを願っていました。

答えて

24

を与えます

"New York City".split(" ").flatMap(_.headOption).mkString 

あるいは

"".split(" ").flatMap(_.headOption).mkString 

dhgで示唆されているように、"\\s+"などのより適切な正規表現を使用することもできます。しかし、その後1は全く同じように、より適切なもの使用することがあります:

"""\w+""".r.findAllIn("New York City").map(_.head).mkString 

(。我々は.headバージョンで行くことができますので、ここでは/\w+/がうまくいけば、病的な例から私たちを惜しまなければならない)

+3

' "ニューヨーク" .split( "\\ S +")。マップ(_。頭)。mkString'は 'Option'なしで同じ目標を達成します。 – dhg

+2

@dhg ...空の文字列で失敗します。 – Debilski

+0

空の結果をフィルタリングして有効なものだけを残して、 '_.head'メソッドを使うことができます:' 'New York City '' .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) 

あなたはList[Char]上の文字列を使用mkStringをしたい場合:

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

取得する:

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

は、他のすべてのバージョンが正常に動作しますが不正な形式の文字列(行の2つのブランク、空の文字列)との失敗を避けるために、また働く

"New York City".split(" ").flatMap(_.headOption).mkString 

を使用するあなたのchar配列

2

をここに代わるものですsplit(Regex)を使用します。

トリックは、文字列をトラバースするときに同じ 反復で現在と前の文字のテストを許可するためにzipを使用することです。単語境界は、文字以外の文字で始まる任意の文字で構成されます。

最初の文字と最後の文字の2つの特別なケースは、1)郵便番号 に必要な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)