Scala:获取列表[People]并将其转换为地图[String,List[People]]

Scala:获取列表[People]并将其转换为地图[String,List[People]],scala,dictionary,collections,Scala,Dictionary,Collections,我对Scala非常陌生,我正在尝试了解如何使用集合。如果我有一个列表[People],所有人都有名字,有没有办法把它转换成地图[Person.getName,List[People]] 我试过了 list map (t => t.getName() -> t) toMap, 但这只会返回一张地图[姓名,人物]。我该怎么做 提前感谢。groupBy将获取一个列表[人员],并根据您提供的“鉴别器函数”将其转换为映射[字符串,列表[人员],在本例中,该函数用于从人员中选择姓名 scal

我对Scala非常陌生,我正在尝试了解如何使用集合。如果我有一个列表[People],所有人都有名字,有没有办法把它转换成地图[Person.getName,List[People]]

我试过了

list map (t => t.getName() -> t) toMap, 
但这只会返回一张地图[姓名,人物]。我该怎么做


提前感谢。

groupBy
将获取一个
列表[人员]
,并根据您提供的“鉴别器函数”将其转换为
映射[字符串,列表[人员]
,在本例中,该函数用于从
人员中选择姓名

scala> case class Person(name: String, age:Int)
defined class Person

scala> val people = List(Person("Alice", 42), Person("Bob", 42))
people: List[Person] = List(Person(Alice,42), Person(Bob,42))

scala> people.groupBy(p => p.name)
res0: scala.collection.immutable.Map[String,List[Person]] = Map(Bob -> List(Person(Bob,42)), Alice -> List(Person(Alice,42)))

groupBy
将根据您提供的“鉴别器函数”获取一个
列表[人]
并将其转换为一个
映射[字符串,列表[人]
,在本例中,该函数用于从
中选择姓名

scala> case class Person(name: String, age:Int)
defined class Person

scala> val people = List(Person("Alice", 42), Person("Bob", 42))
people: List[Person] = List(Person(Alice,42), Person(Bob,42))

scala> people.groupBy(p => p.name)
res0: scala.collection.immutable.Map[String,List[Person]] = Map(Bob -> List(Person(Bob,42)), Alice -> List(Person(Alice,42)))

如果您想自己动手并了解其工作原理,可以尝试以下方法:

scala> case class Person(name: String, surname: String, age:Int)
defined class Person

scala> val people = List(Person("Alice", "Wonderland", 42), Person("Bob", "Father", 42), Person("Bob", "Son", 20))
people: List[Person] = List(Person(Alice,Wonderland,42), Person(Bob,Father,42), Person(Bob,Son,20))

scala> val names = people.map(_.name).distinct
names: List[String] = List(Alice, Bob)

scala> names.map(n => n -> people.filter(_.name == n)).toMap
res0: scala.collection.immutable.Map[String,List[Person]] = Map(Alice -> List(Person(Alice,Wonderland,42)), Bob -> List(Person(Bob,Father,42), Person(Bob,Son,20)))

干杯

如果您想自己动手并了解它的工作原理,您可以尝试以下方法:

scala> case class Person(name: String, surname: String, age:Int)
defined class Person

scala> val people = List(Person("Alice", "Wonderland", 42), Person("Bob", "Father", 42), Person("Bob", "Son", 20))
people: List[Person] = List(Person(Alice,Wonderland,42), Person(Bob,Father,42), Person(Bob,Son,20))

scala> val names = people.map(_.name).distinct
names: List[String] = List(Alice, Bob)

scala> names.map(n => n -> people.filter(_.name == n)).toMap
res0: scala.collection.immutable.Map[String,List[Person]] = Map(Alice -> List(Person(Alice,Wonderland,42)), Bob -> List(Person(Bob,Father,42), Person(Bob,Son,20)))

干杯

这是一种非常缓慢的方式。O(N^2),对于第二个
map
@TheArchetypalPaul,是的,他没有考虑性能,只是一种处理信息的替代方法,可能有助于op对此进行推理。groupBy绝对更简洁、更高效。干杯这是一种非常缓慢的方式。O(N^2),对于第二个
map
@TheArchetypalPaul,是的,他没有考虑性能,只是一种处理信息的替代方法,可能有助于op对此进行推理。groupBy绝对更简洁、更高效。干杯