不可变的Scala集合

时间:2016-11-24 19:05:59

标签: 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
    }

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

    println("")
  }
}

我想问一下,如何用更不合适的函数式编程编写带有不可变集合的相同程序?

提前致谢。

3 个答案:

答案 0 :(得分:3)

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

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

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

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

对结果进行排序,然后将List转换为String,其元素用字符串&#34分隔; - &#34;。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

  1. 用不可变的
  2. 替换可变集合
  3. 添加添加随机数的功能,如:
  4. 选项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方式编码。 其余的代码看起来还不错。