Scala用随机值填充map



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

我有两个创建测试数据的函数,例如:
def f1: String = { ... )
def f2: String = { ... }

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

我的地图是:

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

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

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

我如何在scala中完成这个,而不需要销毁和重建列表10000次?

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

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

您可以使用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.apply函数:

scala> val m = collection.immutable.TreeMap(List.fill(5)(f1 -> f2) : _*)
m: scala.collection.immutable.TreeMap[String,String] = 
     Map(3cieU -> iy0KV, 8oUb1 -> YY6NC, 95ol4 -> Sf9qp, GhXWX -> 8U8wt, ZD8Px -> STMOC)
val m = (1 to 10000).foldLeft(Map.empty[String,String]) { (m, _) => m + (f1 -> f2) }

使用tabulate如下所示,

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

随机密钥生成器函数是否可以复制一些密钥证明是不清楚的,在这种情况下,10000迭代将不足以产生这种大小的映射。

直观的方法,

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

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

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

最新更新