gpt4 book ai didi

Scala:与列表中的整数匹配的for循环

转载 作者:行者123 更新时间:2023-12-04 17:44:06 25 4
gpt4 key购买 nike

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)

然后是这样的:
for (i <- 1 to 100) {
whenever i == to a number in z: 'Condition a met: do something'
else {
'condition b met: do something else'
}
}

我尝试使用 contains===!但似乎没有任何效果。我还能怎么做?

最佳答案

您生成的随机数可能会产生重复...可以吗?以下是如何轻松生成 10 个唯一数字 1-100(通过生成 1-100 的随机混洗序列并取前十个):

val r = scala.util.Random.shuffle(1 to 100).toList.take(10)

现在,您可以简单地将 1-100 范围划分为包含在随机生成列表中的那些和不包含的那些:
val (listOfA, listOfB) = (1 to 100).partition(r.contains(_))

现在对这两个列表做任何你想做的事情,例如:
println(listOfA.mkString(","))
println(listOfB.mkString(","))

当然,你总是可以简单地一一浏览列表:
(1 to 100).map {
case i if (r.contains(i)) => println("yes: " + i) // or whatever
case i => println("no: " + i)
}

您认为的简单 for 循环实际上不是一个。它是一个 for-comprehension,它是一种语法糖,可以将其分解为 map、flatMap 和过滤器的链式调用。是的,它可以像使用经典的 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

现在 results包含一百个 "yes x"和 "no x"字符串的列表,但您没有做丑陋的事情并在映射过程中将日志记录作为副作用执行。相反,您将集合的每个元素映射到相应的字符串中(请注意,原始集合保持不变,因此如果 (1 到 100) 存储在某个值中,它仍然存在;映射会创建一个新集合),现在您可以执行任何操作你想要它,例如将其传递给记录器。是的,在某些时候你需要做“丑陋的副作用”并记录这些东西,但至少你会有一个特殊的代码部分来做这件事,你不会将它混合到你的映射逻辑中来检查数字包含在随机序列中。

关于Scala:与列表中的整数匹配的for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42330544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com