首页 > 解决方案 > 如何根据列表的第一个元素对对象列表的列表进行分组

问题描述

如何根据列表的ListsObjects一个元素对列表进行分组?

我正在使用的一个库向我返回了一个对象列表列表。

val result = (List(PersonObj(name=John,Id=23), LikesOrder(type=toys, order=1), ItemLiked(type=figurerine,id=23)), 
List( PersonObj(name=John,Id=23), LikesOrder(type=toys, order=2), ItemLiked(type=figurerine,id=32))
),List( PersonObj(name=Tiffanny,Id=32), LikesOrder(type=toys, order=1), ItemLiked(type=figurerine,id=23) ))

列表中的每个项目代表 1 次用户交互。在我提供的列表中,我们有 3 个交互条目。其中 2 个条目来自 John,其 id 为 23,并且有 2 个项目喜欢。

我有办法做到这一点吗?

上面的结果将导致映射Map<PersonObj, List<ItemLiked>>

Scala有可能吗?

标签: scala

解决方案


如果内部列表总是PersonObj, LikesOrderItemLiked你可以

case class PersonObj(name: String, Id: Int)
case class LikesOrder(ttype: String, order: Int)
case class ItemLiked(ttype: String, id: Int)



val result = List(
  List(PersonObj(name="John",Id=23),
    LikesOrder(ttype="toys", order=1),
    ItemLiked(ttype="figurerine",id=23)),
  List( PersonObj(name="John",Id=23),
    LikesOrder(ttype="toys", order=2),
    ItemLiked(ttype="figurerine",id=32)),
  List( PersonObj(name="Tiffanny",Id=32),
    LikesOrder(ttype="toys", order=1),
    ItemLiked(ttype="figurerine",id=23) ))

val r1 =result.map(l => {
  val List(p:PersonObj,_: LikesOrder,il : ItemLiked) = l
  (p -> il)
})

r1.groupBy{case (p,_)=>p}.map{case (p,l) => (p,l.map(_._2))}

推荐阅读