不可变的 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.
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)
我有这个 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.
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)