不可变Scala集合
我有一个Scala代码,为意大利彩票吐出唯一的随机数:不可变Scala集合,scala,collections,functional-programming,immutability,immutable-collections,Scala,Collections,Functional Programming,Immutability,Immutable Collections,我有一个Scala代码,为意大利彩票吐出唯一的随机数: object Enalotto { def main(args: Array[String]): Unit = { val numbers = scala.collection.mutable.SortedSet[Int]() val r = scala.util.Random while(numbers.size < 6) { numbers += r.nextInt(90) + 1
object Enalotto {
def main(args: Array[String]): Unit = {
val numbers = scala.collection.mutable.SortedSet[Int]()
val r = scala.util.Random
while(numbers.size < 6) {
numbers += r.nextInt(90) + 1
}
for ((number, index) <- numbers.view.zipWithIndex) {
if(number < 10) print("0")
print(number)
if(index < 5) print(" - ")
}
println("")
}
}
objectenalotto{
def main(参数:数组[字符串]):单位={
val numbers=scala.collection.mutable.SortedSet[Int]()
val r=scala.util.Random
而(数字。大小<6){
数字+=r.nextInt(90)+1
}
用于((编号、索引)
将可变集合替换为不可变集合
Add函数添加随机数,如:
备选案文1
def addNumber(l: List[Int], n : Int) : List[Int] = n::l
选项2.使用发电机:
for{
i <- 0 to 6
r = scala.util.Random
} yield r;
用于{
我
将可变集合替换为不可变集合
Add函数添加随机数,如:
备选案文1
def addNumber(l: List[Int], n : Int) : List[Int] = n::l
选项2.使用发电机:
for{
i <- 0 to 6
r = scala.util.Random
} yield r;
用于{
我
这是您的生成器和格式化程序
说明:我正在调用List
伴生对象的iterate()
方法。它创建一个由7个元素组成的新List
,从值0开始。对于之后的每个值,它调用生成随机值的匿名函数
现在我们有了我们的列表。使用尾部
,因为我们实际上对起始值0不感兴趣
对结果进行排序,并将列表
转换为字符串
,元素之间用字符串“-”分隔
这是您的生成器和格式化程序
说明:我正在调用List
伴生对象的iterate()
方法。它创建一个由7个元素组成的新List
,从值0开始。对于之后的每个值,它调用生成随机值的匿名函数
现在我们有了我们的列表。使用尾部
,因为我们实际上对起始值0不感兴趣
对结果进行排序,并将列表
转换为一个字符串
,元素之间用字符串“-”分隔如果需要6个唯一的数字,最简单的方法是随机排列整个范围,只需从结果中选取前6个:
val numbers = util.Random.shuffle(1 to 90).take(6).sorted
val formatted = numbers map {"%02d".format(_)} mkString " - "
println(formatted)
如果您需要6个唯一的数字,最简单的方法是随机洗牌整个范围,只需从结果中选取前6个:
val numbers = util.Random.shuffle(1 to 90).take(6).sorted
val formatted = numbers map {"%02d".format(_)} mkString " - "
println(formatted)
所以,据我所知,迭代是部分函数?它接受尾部作为列表进行处理。?@PavelOliynyk,解释补充道,“使用映射到小于10的零数字。”呃,这不是OP的原作。那个零填充的单位数!好好看看我的代码:while循环不仅可以迭代6次,而且可以迭代到集合有6个元素,事实上,一个相等的随机数不会被添加到一个集合中。你的答案很好,但恐怕它只迭代了6次,我错了吗?@MirkoBenedetti所以你接受了“非常好”,但完全错误的答案?你想要6个不同的数字,对吗?所以迭代是我理解的部分函数?它接受尾部作为列表进行处理。?@PavelOliynyk,解释补充道。“使用映射到小于10的零数字,”呃,这不是OP的原作。那个零填充的单位数!好好看看我的代码:while循环不仅可以迭代6次,而且可以迭代到集合有6个元素,事实上,一个相等的随机数不会被添加到一个集合中。你的答案很好,但恐怕它只迭代了6次,我错了吗?@MirkoBenedetti所以你接受了“非常好”,但答案完全错误?你想要6个不同的数字,对吗?你的结果类型是Vector
,而不是SortedSet
。val list={for{i这取决于您下一步计划做什么……您是否可以使用评估模型??取决于您希望的速度,从向量
转换到列表
(或排序集
)需要时间。向量在性能方面更快:))一切都取决于你的计划你的结果类型是Vector
,而不是SortedSet
。val list={对于{i},它取决于你下一步打算做什么……你对评估模型满意吗??取决于你希望它的速度,从Vector
转换到list
(或SortedSet
)需要时间。向量在性能方面更快:)这一切都取决于您的计划为何要在此处使用不可变集合?这是可能的(例如,递归,因为您不知道原始集合大小),但不合理,至少在while
循环中不合理。一种可能的解决方案(如果将+
替换为+=
,也可以使用可变集合):Stream.iterate(collection.immutable.SortedSet[Int]())(+(util.Random.nextInt(90)+1)).dropWhile(u.size<6).head
这只是为了示例的缘故。为什么要在这里使用不可变集合?这是可能的(例如,递归,因为您不知道原始集合大小),但不会被证明是正确的,至少在while
循环中不会。一种可能的解决方案(如果您将+
替换为+=
),也适用于可变集合):流。迭代(collection.immutable.SortedSet[Int]()(+(util.Random.nextInt(90)+1))。dropWhile(0.size<6).head
这只是为了示例。如果需要将6从1区分为1000000,会发生什么?如果需要将6从1区分为1000000,会发生什么?