不可变的 Scala 集合

Immutable Scala Collection

我有这个 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. 将可变集合替换为不可变集合
  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 方式进行编码。 其余代码看起来没问题。

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

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


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

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

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

如果您需要 6 个唯一数字,最简单的方法是随机打乱整个范围,只取结果中的前六个:

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