2016-08-10 3 views
-1

として、子コレクションによって車のリストを拡大:は、私は車のリストを持っているキー

val cars = List(car1, car2, car3, car4, car5) 
case class car(model: String, age: Int, partIds: Seq[String]) 

は、私は今、キーがpartIdで、値がマップにこのリストを変換したいですその部分のすべての車。

val partMap: Map[String, List[Car]] 

答えて

2

あなたは中間型を使用して、いくつかのフープを介してジャンプする必要があります。解決策はまずリスト[Car]からリスト[PartId - > Car]に移動します。 Seqの部品を落とすことで、あなたの人生が楽になります。あなたは簡単にあなたの車をグループ化することができます。

mapValuesはMapの関数です。すべてのタプルを繰り返し処理し、mapの値と等しい型を取る関数が必要になります。私の場合はmapValuesの前にMap [String、List [String - > Car]]があります。リスト[(文字列、車]):

mapValuesは、署名(carMappingと機能を望んでいる、ここでA ...私たちの希望のタイプはもちろん、リストのある[車]

はGROUPBYとaの上に何かあります?mapValuesについて少し:http://markusjais.com/the-groupby-method-from-scalas-collection-library/

case class Car(model: String, age: Int, partIds: Seq[String]) 

    object ListToMap extends App { 

    val car1 = Car("corolla", 1, Seq("b")) 
    val car2 = Car("camry", 5, Seq("b", "c")) 
    val car3 = Car("fit",  6, Seq("e")) 
    val car4 = Car("prelude", 2, Seq("e", "f")) 
    val car5 = Car("cobalt", 10, Seq("j")) 

    val cars = List(car1, car2, car3, car4, car5) 

    //For Every Car lets make the list of Tuples for PartId -> Car 
    def partMapping(car : Car) : Seq[(String, Car)] = car.partIds.map(part => part -> car) 


    def toPartMap(cars : List[Car]) : Map[String, List[Car]] = 
     cars 
     //Get the List of Tuples PartId -> Car and then flatten the internal list (same as map().flatten) 
     .flatMap(partMapping) 
     // group all the tuples by the partId 
     .groupBy(_._1) 
     // We currently have a Map[String, List[(partId -> Car)]] we need to clean that up a bit to remove the partId 
     .mapValues(carMapping => carMapping.map(_._2)) 


    toPartMap(cars).foreach(println) 
    } 
+0

私は、mapValuesがマップ上でのみビューを作成することを知りました。あなたはそれを使用してcarfulすることがあります:http://stackoverflow.com/questions/14882642/scala-why-mapvalues-produces-a-view-and-is-there-any-stable-alternatives – Jono

1
cars flatMap (x => x.partIds map ((_, x))) groupBy (_._1) mapValues (_ map (_._2)) 
+0

あなたは_._ 2が何を表すかわからない何をしているかmapValues説明でき –

+0

'車flatMap(X => x.partIdsマップ((_、X)))'を作成最初の要素がpartId、2番目の要素がcarであるタプルのリストpartId - >(partId、car)を作成する 'groupBy' partId' mapValues'は値をマップします(partId、ca r) 'を' 'ちょうど' 'car 'に変更します。 '_. 2 'はタプルの2番目の項目を取得することを意味します。お役に立てれば。 – ryan

関連する問題