scala - 使用 map 将 Map("a" -> 2, "b" -> 1) 转换为 seq("a","a","b")
问题描述
我正在尝试通过 map 函数将 Map("a" -> 2, "b" -> 1) 转换为 seq("a","a","b") ,目前我正在尝试运行代码下面给了我想要的结果。
有没有更聪明的方法来做到这一点?可能是通过地图功能的更好方法?
var multiset : Seq[T] = Seq[T]()
var variables : Seq[T] = data.map(x => x._1).toSeq
var variableCounts : Seq[Int] = data.map(x => x._2).toSeq
for(x <- 0 until variables.length){
for(y <- 0 until variableCounts(x))
multiset = multiset :+ variables(x)
}
解决方案
你可以这样做: 使用 fill 方法GenTraversableFactory
def fill[A](n: Int)(elem: => A): CC[A]
从 fill 的定义中我们可以看到它需要一个整数和一个元素。整数告诉我们需要填充给定元素多少次。
object Demo extends App {
val x = Map("a" -> 2, "b" -> 1)
val p: Seq[String] = x.flatMap { tuple =>
List.fill(tuple._2)(tuple._1)
}.toSeq
print(p)
//output: List(a, a, b)
}
我希望它有帮助!!!
如果要避免使用 tuple._1 和 tuple._1 可以使用以下方法。
object Demo extends App {
val x = Map("a" -> 2, "b" -> 1)
val p: Seq[String] = x.flatMap { case (key, value) =>
List.fill(value)(key)
}.toSeq
print(p)
//output: List(a, a, b)
}
推荐阅读
- java - CordovaError: 无法执行 shell 命令“getprop,dev.bootcomplete””
- python - Aiohttp routing (aiohttp.web.RouteTableDef)
- node.js - 在 lambda 中,无法将请求正文解析为 json
- python - 扩展 Python 类的 init 方法
- xamarin - Xamarin Forms Webview - 滚动事件
- python - Django - 多过滤查询集返回空查询集
- ssl - 两个虚拟主机上的一个多站点 SSL(Ubuntu 16.04 上的 Apache2)
- c# - UserManager.FindAsync(model.UserName, model.Password) 返回 null
- intellij-idea - 我在哪里可以获得构建 Restful API 的详细信息?
- html - 如何摆脱不必要的垂直滚动条?