【问题标题】:Transform Seq[A] to Map[Int, Seq[A]]将 Seq[A] 转换为 Map[Int, Seq[A]]
【发布时间】:2014-08-25 18:12:29
【问题描述】:

如何在 Scala 中将 Seq[A] 转换为 Map[Int, Seq[A]],其中 Int 的值是 A 的参数(以函数方式)?

例子:

val futures: Seq[Future[Seq[A]]] = ???
val gathered = Future.collect(futures)
gathered.map {
    res => {
       val myseq:Seq[A] = res.flatten
       myseq.map(a => (a.param, a)).toMap
    }
}

结果值将是 Map[Int, A]。相反,我想要一个具有相同 Int 参数 (Map[Int, Seq[A]) 的所有 A 的序列

【问题讨论】:

  • 这个问题非常不清楚。您希望将Seq(1,2,3) 转换为(1-> ??).. 的地图?
  • val myseq = Seq((1, 2), (1, 3), (3,4)) 预期:Map(1-> Seq(2, 3), 3 -> Seq( 4))
  • @sonix 请更新您的问题,因为听起来您想采用某种类型 A 并使用它的成员函数/值将您的序列分组到地图中。

标签: scala transformation


【解决方案1】:

您需要向编译器证明有一个 A 类型的参数可以满足您的条件:

trait Param[A]{
  def extract(that: A): Int
}

def seqToMap[A](seq: Seq[A])(implicit proof: Param[A]) = 
  seq groupBy (proof.extract)

除此之外,您可以使用结构类型(涉及反射,因此出于性能原因确实不建议使用。)

【讨论】:

  • 你能在最后一行告诉更多吗?在这里使用结构类型。快速示例会有所帮助:)
  • 为什么甚至需要特质和隐含?你假设A 是一个类型参数吗?
  • @erikallik 因为没有真正的类型,A 是模棱两可的。你不能证明 A 有一个方法 .param 没有东西。
猜你喜欢
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 2019-03-03
  • 2021-01-30
  • 2021-08-31
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多