【问题标题】:extract map from nested case classes从嵌套案例类中提取地图
【发布时间】:2021-08-20 15:18:10
【问题描述】:

我有一个已读入嵌套案例类的 json 值。 从这里我需要一个(类别,评级)的scala地图。请帮助。

预期输出:

Map("MTH1"-> "9A","MTH2"-> "9B","SCI1" -> "8A")

注意:如果任何值为none,则应省略。

需要一些优雅而聪明的方法将值转换为 scala Map

 val myVal: List[myClass] = List(myClass("Tim", "100", Some("hills"),
    List(subject("geometry", Some("MTH1"), Some("9A")),
      subject("trigonometry", Some("MTH2"), Some("9B")),
      subject("physics", Some("SCI1"), Some("8A"))
    )))


  case class myClass(
                      name: String,
                      classId: String,
                      teacher: Option[String],
                      subjects: List[subject]
                    )


  case class subject(
                      name: String,
                      category: Option[String],
                      rating: Option[String]
                    )

  myVal.foreach(i =>
    (
      i.subjects.foreach(
        j => println(j.category.get, j.rating.get)
      )))

【问题讨论】:

  • 如果缺少类别或评级 (None),您希望它做什么?将主题排除在地图之外?
  • 您的“预期输出”无效,因为您不能拥有具有两个相同键的 Map,而此 Map 具有两个“数学”键。它会变成Map("maths"-> "9B","science" -> "8A")
  • 您的预期输出不会像地图一样工作,因为有两个名为“math”的键,并且键必须是唯一的。成对列表对您有用吗?
  • 抱歉键不一样。我正在更新。
  • 不投反对票。我已尽力澄清。

标签: scala


【解决方案1】:

将返回List[Map[String,String]]:

myVal.map(_.subjects
           .collect{
             case subject(_,Some(cat),Some(rat)) => cat -> rat
           }.toMap)

原始List 的每个元素都变成Mapcategory -> rating(键-> 值)对。

【讨论】:

  • 列表中会有多张地图吗?我觉得不对吧?
  • 看代码后面写的那句话,或者直接运行代码就知道了。如果 myVal 列表有 2 个 myClass 元素,那么此代码将返回一个带有 2 个独立的 Map 元素的 List
猜你喜欢
  • 2015-10-16
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
相关资源
最近更新 更多