簡體   English   中英

Scala使用隨機值填充地圖

[英]Scala populate map with random values

我需要為基於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)運行它。

您可以使用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)
List.fill(10000)((f1, f2)).toMap
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

使用遞歸函數而不是生成要迭代的范圍(盡管創建了大量中間圖),

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM