0

我有这样的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 
    } 

    for ((number, index) <- numbers.view.zipWithIndex) { 
     if(number < 10) print("0") 
     print(number) 
     if(index < 5) print(" - ") 
    } 

    println("") 
    } 
} 

我想问一下,你会怎么写同样的程序有一个不变的集合,更适当的功能风格编程?

在此先感谢。

+1

为什么你要在这里使用一成不变的收藏?这是可能的(例如递归,因为你不知道原始集合的大小),但不会被证明是合理的,至少不会在'while'循环中。 –

+0

一个可能的解决方案(如果用'+ ='替换'+ +),也可以使用可变集合:'Stream.iterate(collection.immutable.SortedSet [Int]())(_ +(util.Random.nextInt )+ 1))。dropWhile(_。size <6).head' –

+0

这只是为了这个例子。 –

回答

2

如果需要6个独特的数字,这是最简单的,随机混合的整个范围,而只是取前6从结果:

val numbers = util.Random.shuffle(1 to 90).take(6).sorted 
val formatted = numbers map {"%02d".format(_)} mkString " - " 
println(formatted) 
+0

如果你需要'1到1000000'中的不同6,会发生什么? –

0
  1. 替换可变集合与不变
  2. 附加功能添加随机数,如:

选项1.

def addNumber(l: List[Int], n : Int) : List[Int] = n::l 

选项2.使用发电机:

for{ 
    i <- 0 to 6 
    r = scala.util.Random 
} yield r; 

一般说你有多少种方式可以用FP方式编码。 其余代码看起来没问题。

+0

您的结果类型是'Vector',而不是'SortedSet'。 –

+0

VAL列表= { 为{ 我< - 0至6 R = scala.util.Random }收益[R } .toList – Pavel

+0

这取决于你打算下一步怎么办?你还好吗与评价模型?? – Pavel

3
List.iterate(0,7)(_ => util.Random.nextInt(90) + 1) 
    .tail 
    .sorted 
    .mkString(" - ") 

这是你的生成器和你的格式化程序。


说明:我打电话List同伴对象的iterate()方法。它会创建一个新的List 7个元素,从值0开始。对于之后的每个值,它会调用生成随机值的匿名函数。

现在我们有我们的清单。以tail为因为我们实际上对起始0值不感兴趣。

对结果进行排序,并将List转换为String,元素用字符串“ - ”分隔。

+0

所以迭代是部分函数,​​据我所知?它接受尾巴作为列表来处理。 – Pavel

+0

@PavelOliynyk,解释添加。 – jwvh

+1

“使用地图零数小于10”,呃,这不是OP原来的功能。这个零填充的单位数字! –