Scala新手.我正在迭代一次for循环100次.10次我想要满足条件'a'和90次条件'b'.但是我希望10 a随机出现.
我能想到的最好的方法是创建一个10个随机整数的val,然后循环1到100个整数.
例如:
val z = List.fill(10)(100).map(scala.util.Random.nextInt)
z: List[Int] = List(71, 5, 2, 9, 26, 96, 69, 26, 92, 4)
Run Code Online (Sandbox Code Playgroud)
然后像:
for (i <- 1 to 100) {
whenever i == to a number in z: 'Condition a met: do something'
else {
'condition b met: do something else'
}
}
Run Code Online (Sandbox Code Playgroud)
我试着用contains和==和=!,但似乎没有任何工作.我怎么能这样做?
你生成的随机数可能会产生重复......是吗?以下是如何轻松生成10个唯一数字1-100(通过生成随机洗牌的1-100并取前10个):
val r = scala.util.Random.shuffle(1 to 100).toList.take(10)
Run Code Online (Sandbox Code Playgroud)
现在,您可以简单地将范围1-100分区为随机生成的列表中包含的范围和不包含的范围:
val (listOfA, listOfB) = (1 to 100).partition(r.contains(_))
Run Code Online (Sandbox Code Playgroud)
现在用这两个列表做任何你想做的事,例如:
println(listOfA.mkString(","))
println(listOfB.mkString(","))
Run Code Online (Sandbox Code Playgroud)
当然,您可以随时简单地浏览列表:
(1 to 100).map {
case i if (r.contains(i)) => println("yes: " + i) // or whatever
case i => println("no: " + i)
}
Run Code Online (Sandbox Code Playgroud)
您认为简单的for循环实际上不是一个.这是一种理解,它是一种语法糖,可以解释为地图,flatMaps和过滤器的链式调用.是的,它可以像使用经典的for循环一样使用,但这只是因为List实际上是一个monad.如果你想用惯用的Scala方式("功能"方式)做一些事情,你应该避免尝试编写经典的迭代for循环,而是选择获取数据的集合,然后将其元素映射到执行你需要的任何东西.请注意,集合后面有一个非常丰富的库,允许您调用很酷的方法,如partition.
编辑(完整性):
此外,你应该避免副作用,或者至少将它们推到尽可能远的路上.我正在谈论我的回答中的第二个例子.假设您确实需要记录这些内容(您将使用记录器,但println对于此示例来说已经足够了).这样做很糟糕.顺便说一下,你可以使用foreach而不是map在那种情况下,因为你没有收集结果,只是执行副作用.
好的方法是通过将每个元素修改为适当的字符串来计算所需的东西.因此,计算所需的字符串并将它们累积到results:
val results = (1 to 100).map {
case i if (r.contains(i)) => ("yes: " + i) // or whatever
case i => ("no: " + i)
}
// do whatever with results, e.g. print them
Run Code Online (Sandbox Code Playgroud)
现在results包含一百个"是x"和"无x"字符串的列表,但是您没有做出丑陋的事情并且在映射过程中执行日志作为副作用.相反,您将集合的每个元素映射到相应的字符串(请注意,原始集合保持不变,因此如果(1到100)存储在某个值中,它仍然存在;映射会创建一个新集合)现在您可以执行任何操作你想要它,例如传递给记录器.是的,在某些时候你需要做"丑陋的副作用"并记录这些东西,但至少你会有一个特殊的代码部分来做这件事而你不会把它混合到你的映射逻辑中来检查是否有数字包含在随机序列中.
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |