【问题标题】:Turning Map("a" -> 2, "b" -> 1) into seq("a","a","b") using map使用 map 将 Map("a" -> 2, "b" -> 1) 转换为 seq("a","a","b")
【发布时间】:2021-01-30 23:51:09
【问题描述】:

我正在尝试通过 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)
    }

【问题讨论】:

  • 您的数据实际上是("a" -&gt; 2, "b" -&gt; 1) 还是Map("a" -&gt; 2, "b" -&gt; 1)?因为前者不是Map
  • 不确定您的代码应该做什么。

标签: scala loops iterator higher-order-functions simplification


【解决方案1】:

你可以这样做: 使用GenTraversableFactorydef fill[A](n: Int)(elem: =&gt; 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)
}

【讨论】:

  • 你可以使用x.flatMap { case (key, value) =&gt; ...}来避免使用._1/._2
  • 这只是一回事,感谢您建议用另一种方法更新我的答案。 @Marth
【解决方案2】:

我不确定您的数据究竟是什么形状。问题中这部分有点不清楚。

Map('a' -> 3, 'b' -> 1)

确实是一张地图。而

('a' -> 3, 'b' -> 1)

元组中的去糖

(('a', 3), ('b', 1))

如果是前一种情况,你可以这样折叠

val m : Map[String, Int] =  Map("a" -> 2, "b" -> 1) 
val res = m.foldLeft(List[String]())((a, b) => a ++ List.fill(b._2)(b._1))

这里res 将是List('a', 'a', 'b')

这里发生的事情是我们从一个空的累加器开始,遍历 Map 的键值对,创建一个重复给定键、值时间的列表并将其连接到累加器

不幸的是,如果不使用 Shapeless 之类的东西,后者会有点困难,因为在 Scala 2 中,从元组转换时类型信息会丢失。您需要对注释进行一些类型的处理

val ml = ("a" -> 2, "b" -> 1).productIterator
ml.foldLeft(List[String]())((a, b) => b match{ 
   case (k: String, v : Int) => a ++ List.fill(v)(k)
})

【讨论】:

    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 2013-07-02
    • 2012-10-11
    • 2015-07-30
    • 2014-08-25
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多