【问题标题】:Scala reduce on Case class with keysScala减少带有键的Case类
【发布时间】:2016-06-08 09:00:39
【问题描述】:

以下是我拥有的 2 个案例类的场景 -

case class Pack(name: String, age: Int, dob: String)

object Pack{
  def getPack(name:String, age: Int, dob:String): Pack = {
    Pack(name,age,dob)
  }
}

case class NewPack(name: String, pack: (List[Pack]))

object NewPack{
  def getNewPackList(data: List[Pack]): List[NewPack] = {
    val newData = for(x <- data )yield(x.name,List(x))
    val newPackData = for(x <- newData)yield(NewPack(x._1,x._2))
    newPackData
  }
}


val someData = List(Pack.getPack("x",12,"day1"), Pack.getPack("y",23,"day2"),Pack.getPack("x",34,"day3") )

val somePackData = NewPack.getNewPackList(someData)

someData 和 somePackData 的值是这样的 -

someData: List[Pack] = List(Pack(x,12,day1), Pack(y,23,day2), Pack(x,34,day3))

somePackData: List[NewPack] = List(NewPack(x,List(Pack(x,12,day1))), NewPack(y,List(Pack(y,23,day2))), NewPack(x,List(Pack(x,34,day3))))

现在我想获得下面提到的格式的最终​​数据。谁能建议我这样做的更好方法。

finalData: List[NewPack] = List(NewPack(x,List(Pack(x,12,day1),Pack(x,34,day3)),NewPack(y,List(Pack(y,23,day2))))

【问题讨论】:

    标签: scala dictionary reduce


    【解决方案1】:

    这里是一个小的简化。

    case class Pack(name: String, age: Int, dob: String)
    
    case class NewPack(name: String, pack: List[Pack])
    
    object NewPack{
      def getNewPackList(data: List[Pack]): List[NewPack] = 
        data.map{case pack@Pack(name, _, _) => NewPack(name, List(pack))}
    }
    

    请注意,通常情况下您不需要额外的工厂方法。如果您想稍后展示一些棘手的内容,您可以随时在伴随对象中定义自定义 apply

    此外,如果您打算按名称对包进行分组,您可以轻松定义类似

    def newPacksGrouped(data: List[Pack]): List[NewPack] =
      data.groupBy(_.name).map{case (name, packs) => NewPack(name, packs)}.toList
    

    【讨论】:

      猜你喜欢
      • 2015-12-07
      • 2019-07-09
      • 2018-09-14
      • 1970-01-01
      • 2016-11-24
      • 2020-09-17
      • 2014-08-04
      • 2017-06-05
      • 2014-05-19
      相关资源
      最近更新 更多