2016-06-15 7 views
1

私はScalaには新しく、Collectionsの使い方を理解しようとしています。 List [People]が名前を持っている場合、これをMap [Person.getName、List [People]]にする方法があります。Scala:リストを[人]にしてマップに変換する[文字列、リスト[人]]

私は

list map (t => t.getName() -> t) toMap, 

を試みたが、唯一の地図[名、人々]を返します。これはどうすればいいですか?

ありがとうございます。

答えて

6

groupByは、あなたがこのケースでPersonから名前を選択することである提供List[People]取ると、それは「弁別機能」に基づいてMap[String, List[People]]にtransfromます。

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

あなたはそれを自分で行うと、それがどのように動作するか学びたいのであれば、あなたはこれを試すことができます。

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

乾杯

+0

それを行うのは本当に遅い方法です。 O(N^2)を、第2の 'map'のために使用します。 –

+0

@TheArchetypalPaulは、パフォーマンスを考慮していませんでした。操作を助けてくれる情報を操作する代わりの方法です。 groupByは間違いなく簡潔で効率的です。乾杯 – saza

関連する問題