Scala使用随机值填充地图

时间:2015-09-03 18:47:02

标签: scala

我需要基于Map和HashMap为各种集合创建一个测试。

我有两个创建测试数据的函数,例如:

def f1: String = { ... )
def f2: String = { ... }

这些函数在每次调用时都会创建随机数据。

我的地图是:

val m:Map[String,String] = ...

我试图完成的是构造一个不可变的映射,其中包含10000个随机项,这些项是通过调用f1 / f2生成的。所以protocode会是:

for 1 to 10000
   add-key-value-to-map (key = f1(), value = f2() )
end for

如何在scala中完成此操作,而不会破坏和重建列表10000次?

编辑: 由于在上面的原始帖子中不清楚,我试图用各种类型的地图(Map,HashMap,TreeMap)来运行它。

4 个答案:

答案 0 :(得分:3)

您可以使用List.fill创建情侣列表(String, String),然后在其上调用.toMap

scala> def f1 = util.Random.alphanumeric take 5 mkString
f1: String

scala> def f2 = util.Random.alphanumeric take 5 mkString
f2: String

scala> val m = List.fill(5)(f1 -> f2).toMap
m: scala.collection.immutable.Map[String,String] =
     Map(T7hD8 -> BpAa1, uVpno -> 6sMjc, wdaRP -> XSC1V, ZGlC0 -> aTwBo, SjfOr -> hdzIN)

或者您可以使用Map / HashMap / TreeMap的{​​{1}}函数:

.apply

答案 1 :(得分:3)

List.fill(10000)((f1, f2)).toMap

答案 2 :(得分:2)

val m = (1 to 10000).foldLeft(Map.empty[String,String]) { (m, _) => m + (f1 -> f2) }

答案 3 :(得分:1)

使用tabulate如下,

Seq.tabulate(10000)(_ => f1 -> f2).toMap

无法确定随机密钥生成器函数是否可能复制某些密钥,在这种情况下10000迭代不足以生成这样大小的映射。

直观的方法,

(1 to 10000).map(_ => f1 -> f2).toMap

使用递归函数而不是生成迭代范围(尽管创建了许多中间映射),

def g(i: Int): Map[String,String] = {
  if (i<=0) 
    Map() 
  else 
    Map(f1 -> f2) ++ g(i-1)
}