"New York City" というフレーズがある場合、各単語の最初の文字を取得するにはどうすればよいですか? 私のグーグルは、各単語の最初の文字を大文字にする方法を示しただけであり、これは私がやろうとしていることとは一見異なっています。
私の Scala に関する知識が限られていることを考えると、おそらく手続き的にこれを行うことができますが、誰かが Scala の知識を私に流して、この問題に対する機能的なアプローチを示す例を示してくれることを期待していました。
"New York City" というフレーズがある場合、各単語の最初の文字を取得するにはどうすればよいですか? 私のグーグルは、各単語の最初の文字を大文字にする方法を示しただけであり、これは私がやろうとしていることとは一見異なっています。
私の Scala に関する知識が限られていることを考えると、おそらく手続き的にこれを行うことができますが、誰かが Scala の知識を私に流して、この問題に対する機能的なアプローチを示す例を示してくれることを期待していました。
他のすべてのバージョンは正常に動作しますが、不適切な形式の文字列 (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
ます。)
scala> "New York City".split(" ").map(_.head).mkString
res5: String = NYC
これは " " で単語の配列に分割されます。次に、その配列をマップし、最初の文字を取得する String.head を呼び出します。
"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
"New York City".split(" ").map(_.charAt(0))
char配列を提供します
分割(正規表現)を使用する代わりの方法を次に示します。
ここでの秘訣は、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)