首页 > 解决方案 > 使用 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)
    }

标签: scalaloopsiteratorhigher-order-functionssimplification

解决方案


你可以这样做: 使用 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)
}

推荐阅读