8

"New York City" というフレーズがある場合、各単語の最初の文字を取得するにはどうすればよいですか? 私のグーグルは、各単語の最初の文字を大文字にする方法を示しただけであり、これは私がやろうとしていることとは一見異なっています。

私の Scala に関する知識が限られていることを考えると、おそらく手続き的にこれを行うことができますが、誰かが Scala の知識を私に流して、この問題に対する機能的なアプローチを示す例を示してくれることを期待していました。

4

5 に答える 5

24

他のすべてのバージョンは正常に動作しますが、不適切な形式の文字列 (2 つの空白が連続する、空の文字列) による失敗を避けるために、次を使用します。

"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ます。)

于 2012-11-29T00:17:01.453 に答える
13
scala> "New York City".split(" ").map(_.head).mkString
res5: String = NYC

これは " " で単語の配列に分割されます。次に、その配列をマップし、最初の文字を取得する String.head を呼び出します。

于 2012-11-29T00:01:42.067 に答える
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
于 2012-11-29T00:02:32.880 に答える
4
"New York City".split(" ").map(_.charAt(0))

char配列を提供します

于 2012-11-29T00:02:41.110 に答える
2

分割(正規表現)を使用する代わりの方法を次に示します。

ここでの秘訣は、zipを使用して、文字列をトラバースするのと同じ反復で現在および前の文字をテストできるようにすることです。単語の境界は、文字以外の文字が前に付いた任意の文字で構成されます。

最初と最後の2つの特殊なケースは、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) 
于 2012-11-29T11:12:28.597 に答える