【问题标题】:Scala - better way to reformat/grouping List/Map to mapScala - 重新格式化/分组列表/映射以映射的更好方法
【发布时间】:2017-04-04 06:15:09
【问题描述】:

我有编码最佳方式或正确方式以功能方式对列表进行分组/格式化的问题。

示例列表是这个

 val list = List (
        Map(
          "name" -> "AAA",
          "id" -> "1",
          "category" -> "1",
          "sub_category" -> "1"
        ),

        Map(
          "name" -> "BBB",
          "id" -> "2",
          "category" -> "1",
          "sub_category" -> "2"
        ),

        Map(
          "name" -> "CCC",
          "id" -> "3",
          "category" -> "1",
          "sub_category" -> "2"
        ),

        Map(
          "name" -> "DDD",
          "id" -> "4",
          "category" -> "2",
          "sub_category" -> "1"
        ),

        Map(
          "name" -> "EEE",
          "id" -> "5",
          "category" -> "2",
          "sub_category" -> "2"
        )
      )

我想按类别和子类别进行分组。预期的结果是这样的

Map(
        2 -> Map(
          2 -> MutableList(
            Map(name -> EEE, id -> 5, category -> 2, sub_category -> 2)
          ),

          1 -> MutableList(
            Map(name -> DDD, id -> 4, category -> 2, sub_category -> 1)
          )
        ),

        1 -> Map(
          2 -> MutableList(
            Map(name -> BBB, id -> 2, category -> 1, sub_category -> 2),
            Map(name -> CCC, id -> 3, category -> 1, sub_category -> 2)
          ),

          1 -> MutableList(
            Map(name -> AAA, id -> 1, category -> 1, sub_category -> 1)
          )
        )
      )

预期的输出可以包含 List 或 MutableList,我已经完成了这样的代码

val filtered:mutable.Map[Int,mutable.Map[Int,mutable.MutableList[Map[String,String]]]] =  mutable.Map()

      for(each <- list) {

        if(filtered.contains(each("category").toInt)) {

          if(filtered(each("category").toInt).contains(each("sub_category").toInt)) {

            filtered(each("category").toInt)(each("sub_category").toInt) += each

          } else {
            filtered(each("category").toInt) += (
              each("sub_category").toInt -> mutable.MutableList(each)
              )
          }
        } else {
          filtered += (
            each("category").toInt -> mutable.Map(each("sub_category").toInt -> mutable.MutableList(each))
            )
        }
      }

我得到了结果,这不是我想要的正确方法来执行此操作的功能方式有人可以帮助我吗?

【问题讨论】:

    标签: scala


    【解决方案1】:

    我认为这会得到您正在寻找的结果。

    list.groupBy(_("category")).mapValues(_.groupBy(_("sub_category")))
    

    我不得不说,您似乎正在使用 Map,而设计良好的 case class 会是更好的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      相关资源
      最近更新 更多