2017-07-21 7 views
-1

私はこの私の関数が数値を持つ文字列を生成するのはなぜですか?

randomString(10) 

を実行したときに、私はこのことで困惑していた出力

"UfuoB8POL5" 

を取得

import scala.util.Random 
def randomString(length: Int) : String = { 
    Random.alphanumeric.dropWhile(_.isDigit).take(length).mkString 
} 

のJava 1.8.0_121 Scalaの2.12.2を使用してこのコードを書き、なぜ8と5のような数字が関数の最終出力になるのか理解していないのですか?それは除外されているはずです。

答えて

3

dropWhileの代わりにfilterNotを使用する必要があるためです。簡単な例でその差を実証するために:つまり

"123abc456def".dropWhile(_.isDigit) // results into "abc456def" 
"123abc456def".filterNot(_.isDigit) // results into "abcdef" 

を、dropWhilefilterNotは述語を満たさないすべての要素を削除しながら、述語を満たしていない接頭辞を削除します。

1

あなたは条件が真である間

Random.alphanumeric.filterNot(_.isDigit).take(length).mkString 

dropWhileは、シーケンスの要素をスキップfilterNot機能を使用する必要があります。シーケンスがSeq("1", "2", "a", "3")であると想像してください。それは"1", "2"をスキップし、残りの部分を返します。

+0

dropWhileのみ、最初しかし多くの項目をスキップし、それを返します**すべての**その時点から残りの項目? – MyStackRunnethOver

+1

はい、たとえば、 'str.dropWhile(_。isWhitespace)'の文字列から先行スペースを整えることができます。 – Dylan

0
Random.alphanumeric.dropWhile(_.isDigit).take(length).mkString 

英数字は、文字列を生成するときに数字と文字の両方が使用されることを意味します。あなたは数字を「フィルタリング」する必要があります。

は次のようになります。それは評価がfalseの最初のアイテムが見つかるまで

Random.alphanumeric.filterNot(_.isDigit).take(length).mkString 
+0

解決策は正しいようですが、説明しません。 '英数字 'はここでは問題ではありません - ' _.dropWhile'は – MyStackRunnethOver

+0

です。私はまだスカラとこの全回答の質問に新しいです。 – jshedrof

関連する問題