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原來的功能。這個零填充的單位數字! –