val monies: Map[String, Double] = Map(
"USD-EUR" -> 0.7473154,
"EUR-GBP" -> 0.0097373,
"GBP-USD" -> 136.6080875,
"COL-USD" -> 1.0000000,
"ABC-XYZ" -> 1.00034500,
"XYZ-ABC" -> 1.000345000
)
我想要创建一个List[Map[String, Double]]
,它包含上面地图的所有可能组合。
在地图的最终列表中,每个地图必须至少有三种货币(即,任何小于3个条目的地图必须排除在外)。
提供的地图可能有3种货币,也可能有50种。这意味着解决方案必须是可扩展的,例如,如果任何新国家与新货币一起建立的话。
List(
Map(
"USD-EUR" -> 0.7473154,
"EUR-GBP" -> 0.0097373,
"GBP-USD" -> 136.6080875
),
Map(
"EUR-GBP" -> 0.0097373,
"USD-EUR" -> 0.7473154,
"GBP-USD" -> 136.6080875
),
Map(
"EUR-GBP" -> 0.0097373,
"GBP-USD" -> 136.6080875,
"USD-EUR" -> 0.7473154
),
Map(
"USD-EUR" -> 0.7473154,
"EUR-GBP" -> 0.0097373,
"GBP-USD" -> 136.6080875,
"COL-USD" -> 1.0000000,
),
Map(
"EUR-GBP" -> 0.0097373,
"USD-EUR" -> 0.7473154,
"GBP-USD" -> 136.6080875,
"COL-USD" -> 1.0000000,
),
.... etc etc
)
请注意,唯一可能意味着不同的顺序的条目。地图大小的长度也不同。键必须指向原始值。
发布于 2022-05-17 10:29:41
你所需要的似乎是:
def getSubMaps[K, V](map: Map[K, V]): Iterator[Map[K, V]] =
map
.keySet
.subsets
.filter(keys => keys.sizeIs >= 3)
.map(keys => keys.map(key => key -> map(key)).toMap)
由于结果可能太大,所以最好返回一个Iterator
,它将惰性地生成所需的值。如果您确实需要内存中的所有toList
,则始终可以在结束时调用它们。
正如我常说的,是你的朋友。
https://stackoverflow.com/questions/72278924
复制