我需要基于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)来运行它。
答案 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)
}