1

ケースクラスのリストがあります。出力には、ケース クラスのさまざまなパラメーターの集計が必要です。それを行うためのより最適化された方法を探しています。

例:

case class Students(city: String, college: String, group: String,
                    name: String, fee: Int, age: Int)

object GroupByStudents {
  val studentsList= List(
    Students("Mumbai","College1","Science","Jony",100,30),
    Students("Mumbai","College1","Science","Tony", 200, 25),
    Students("Mumbai","College1","Social","Bony",250,30),
    Students("Mumbai","College2","Science","Gony", 240, 28),
    Students("Bangalore","College3","Science","Hony", 270, 28))
}

都市から学生の詳細を取得するには、最初に都市ごとに集計し、次にそれらの詳細を大学ごと、次にグループごとに分割する必要があります。

出力は、以下の形式のケース クラスのリストです。

Students(Mumbai,,,,790,0) -- aggregate city wise
Students(Mumbai,College1,,,550,0)  -- aggregate college wise
Students(Mumbai,College1,Social,,250,0)
Students(Mumbai,College1,Science,,300,0)
Students(Mumbai,College2,,,240,0)
Students(Mumbai,College2,Science,,240,0)
Students(Bangalore,,,,270,0)
Students(Bangalore,College3,,,270,0)
Students(Bangalore,College3,Science,,270,0)

これを達成するための 2 つの方法:

1)すべてのリストをループし、各組み合わせ(上記のケース3の組み合わせ)のマップを作成し、データを集約して新しい結果リストを作成し、それにデータを追加します。

2) foldLeft オプションの使用

studentsList.groupBy(d=>(d.city))
  .mapValues(_.foldLeft(Students("","","","",0,0))
    ((r,c) => Students(c.city,"","","",r.fee+c.fee,0)))

studentsList.groupBy(d=>(d.city,d.college))
  .mapValues(_.foldLeft(Students("","","","",0,0))
    ((r,c) => Students(c.city,c.college,"","",r.fee+c.fee,0)))

studentsList.groupBy(d=>(d.city,d.college,d.group))
  .mapValues(_.foldLeft(Students("","","","",0,0))
    ((r,c) => Students(c.city,c.college,c.group,"",r.fee+c.fee,0)))

どちらの場合も、リストを複数回ループしています。シングルパスと最適化された方法でこれを達成する方法はありますか?

4

2 に答える 2