2017-07-21 80 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

相关问题