2016-02-25 136 views
1

案例類下面是我有2個case類的場景 -斯卡拉減少與鍵

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)))) 

回答

3

這裏是小簡化。

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 [email protected](name, _, _) => NewPack(name, List(pack))} 
} 

請注意,一般情況下,您不需要額外的工廠方法的案例類。如果您稍後想要提出一些棘手的問題,您可以隨時在伴侶對象中定義自定義apply

此外,如果你的名字打算組包,你可以很容易地定義類似

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

謝謝...它的工作:) –