1

私は次のようなケースクラスを持っています:

 case class ReportData(
    building: Option[String] = None,
    serial: Option[String] = None,
    `type`: Option[String] = None,
    model: Option[String] = None,
    machine: Option[String] = None)

そして他の分野も。

たとえば、これらのオブジェクトのリストがあります。

val reports = List(report1, report2, report3, report11, report12)

リクエストは、これらのクラスの特定のフィールドを使用して特定の複雑な操作を実行することです。たとえば、これらのリストをパラメーターとして受け取ったフィールドのみでグループ化します。groupFields="building,serial"

これは細かいグループ化の例です:

val reportsGroupBoth = reports.groupBy(p => (p.building.getOrElse(""), p.serial.getOrElse("")))

しかし、受け取ったフィールドに応じて条件付きにしたいので、私が考えている唯一の方法は、フィールドごとに区切られたグループを作成することです(後で追加します。それらを区切ればif condition、上記と同じ結果を受け取りたいだけです。group by結果のタイプ:Map[(String, String),List[agile.ReportData]]

だから私は試しました:

// group by building (if building is defined in groupFields list)
val reportsGroup1 = reports.groupBy(p => p.building)

これは問題ありませんが、これは間違っています:

// group by building and serial (if building and serial are in groupFields list)
val reportsGroup2 = reportsGroup1 map {
        case (key, value) => (key, value.groupBy(v => v.serial).keys) -> value.groupBy(v => v.serial).values
    }

したがって、問題は、最終的 にtpyereportsGroup2と同じ結果になるように変更する方法ですreportsGroupBothMap[(String, String),List[agile.ReportData]]

4

2 に答える 2