如何使用groupby在Scala中为地图值选择对象字段

时间:2012-03-02 23:30:14

标签: scala

这是一个新手scala问题。我有一个使用getName()getYearOfBirth()方法的Person对象的人员列表。我正在使用groupBy对Person对象进行分组,但我只想把它放在 因为Person将来会有很多其他字段,因此将其命名为地图。这些年是关键。

val people = List(
Person("Tom", 1985),
Person("Abigail", 1987),    
Person("Joyce", 1984),
Person("James", 1987),
Person("Scott", 1985),  
Person("Ruth", 1984)
)


var birthdayMap = people.groupBy(x=> x.getYearOfBirth()) // map to getName() ?

2 个答案:

答案 0 :(得分:8)

scala> persons groupBy (_.year) mapValues (_ map (_.name))
res9: scala.collection.immutable.Map[Int,scala.collection.immutable.Set[String]] = Map(1984 -> Set(Joyce, Ruth), 1987 -> Set(James, Abigail), 1985 -> Set(Tom, Scott))

答案 1 :(得分:0)

Scala 2.13开始,大多数集合都通过groupMap方法提供,该方法等效于groupBy后跟mapValues

people.groupMap(_.yearOfBirth)(_.name)
// Map[Int,List[String]] = Map(1985 -> List(Tom, Scott), 1984 -> List(Joyce, Ruth), 1987 -> List(Abigail, James))
// equivalent to people.groupBy(_.yearOfBirth).mapValues(_.map(_.name))

给定:

case class Person(name: String, yearOfBirth: Int)
val people = List(Person("Tom", 1985), Person("Abigail", 1987), Person("Joyce", 1984), Person("James", 1987), Person("Scott", 1985), Person("Ruth", 1984))