2017-07-21 134 views
-1

我寫了使用Scala的2.12.2的Java 1.8.0_121爲什麼我的函數用數字生成字符串?

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

此代碼時,我跑這

randomString(10) 

我得到的輸出

"UfuoB8POL5" 

我爲此感到困惑和不明白爲什麼像8和5這樣的數字將它變成功能的最終輸出?它應該被過濾掉。

回答

3

發生這種情況是因爲您應該使用filterNot而不是dropWhile。爲了證明自己的一個簡單的例子差異:

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

換句話說,dropWhile只刪除不滿足謂詞,而filterNot刪除不滿足謂詞的所有元素的前綴。

1

您應該使用filterNot功能

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

dropWhile跳過序列的元素,同時條件爲真。想象一下你的順序是Seq("1", "2", "a", "3")。它將跳過"1", "2"並返回休息。

+0

dropWhile只跳過前然而許多項目,直到找到其中的評價是假的第一個項目,然後返回**所有**從這一點上剩餘的項目? – MyStackRunnethOver

+1

是的,例如,您可以用'str.dropWhile(_。isWhitespace)' – Dylan

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

字母數字表示生成字符串時將使用數字和字母。你需要「過濾」出數字。

應該是:

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

來修改字符串中的前導空格。解決方案看起來是正確的,但是您不解釋它。 '字母數字'在這裏不是問題 - '_.dropWhile'是 – MyStackRunnethOver

+0

我在scala和這整個回答問題的東西中還是個新手。 – jshedrof

相關問題