如何存储输出来自仅存储到对象中的案例

时间:2017-03-29 07:22:33

标签: scala dictionary

每当我调用getJsonKeyValue时,它应该打印输出,如下所示,我如何存储getJsonKeyValue的值并相应地使用。

      getJsonKeyValue(WithMap: Map[String, Any])

      def getJsonKeyValue(mapIs: Map[String, Any]) {

         mapIs.foreach {
            case (k: String, v: List[Map[String, Any]]) =>  v.foreach(x => getJsonKeyValue(x))
            case (k: String, v: Any) => (k + "=" + v)

      }

    }

mapIs

Map(RedDef -> List(Map(RedTypP -> ^.{14}XY.*$, RedTypC -> XY, ExpNoOfAt -> 19, attributes -> List(Map(AttId -> 1, AttNa -> Pro Ty, AttMaxLen -> 1, DataTy -> Map(DataTyName -> AN)), Map(AttId -> 2, AttNa -> Pro Cod, AttMaxLen -> 6, DataTy -> Map(DataTyName -> AN)), Map(AttId -> 3, AttNa -> REQ CODE, AttMaxLen -> 7, DataTy -> Map(DataTyName -> AN))), RedLen -> 117, RedDeIn -> 2, MinNoOfAt -> 19), Map(RedTypP -> ^.{14}JK.*$, RedTypC -> JK, ExpNoOfAt -> 10, attributes -> List(Map(AttId -> 1, AttNa -> Log Si Ty, AttMaxLen -> 1, DataTy -> Map(DataTyName -> A)), Map(AttId -> 2, AttNa -> Log Si Cod, AttMaxLen -> 6, DataTy -> Map(DataTyName -> AN)), Map(AttId -> 3, AttNa -> Ex Qu Cod, AttMaxLen -> 7, DataTy -> Map(DataTyName -> AN))), RedDeIn -> 3, MinNoOfAt -> 10), Map(RedTypP -> ^.{14}FK.*$, RedTypC -> FK, ExpNoOfAt -> 33, attributes -> List(Map(AttId -> 1, AttNa -> Pro Ty, AttMaxLen -> 1, DataTy -> Map(DataTyName -> AN)), Map(AttId -> 2, AttNa -> Pro Cod, AttMaxLen -> 6, DataTy -> Map(DataTyName -> AN)), Map(AttId -> 3, AttNa -> REQ CDE, AttMaxLen -> 7, DataTy -> Map(DataTyName -> AN)), Map(AttId -> 4, AttNa -> RED Ty, AttMaxLen -> 2, DataTy -> Map(DataTyName -> AN))), RedLen -> 117, RedDeIn -> 4, MinNoOfAt -> 33)))

输出来自getJsonKeyValue

RedTypP = ^.{14}XY.*$
RedTypC = XY
ExpNoOfAt = 19
AttId = 1
AttNa = Pro Ty
AttMaxLen =1
DataTyName = AN
AttId = 2
AttNa = Pro Cod
AttMaxLen = 6
DataName = AN
AttId = 3
AttNa = REQ CODE
AttMaxLen = 7
DataTyName = AN
RedLen = 117
RedDeIn = 2
MinNoOfAt =19

2 个答案:

答案 0 :(得分:0)

您可以使用mapValues将函数应用于地图中的每个值:

def getJsonKeyValue(mapIs: Map[String, Any]) :Map[String, Any] = {
  mapIs.mapValues {
    case (v: List[Map[String, Any]]) => v.map(x => getJsonKeyValue(x))
    case (v: Any) => v
  }
}

答案 1 :(得分:0)

这个写得不好的问题有很多问题。我将按严重程度对其进行解决。

  1. case (k: String, v: Any) => (k + "=" + v)
  2. 此行返回String,但周围的foreach()返回Unit,因此该结果字符串将被丢弃。有两个简单的解决方案:1)使用map(或其他一些集合操作)而不是foreach来收集结果字符串,或2)使用println()输出结果字符串。 println会返回Unit,与foreach结果匹配。

    1. 未提供数据类型。
    2. 您的示例数据包含String->Map条目,您的代码和预期输出不会占用该条目。

      1. 格式化的样本数据太多。
      2. 您提供的样本数据多于生成所需输出所需的样本数据,并且不仅仅是解释问题所需的方式。 (请阅读this page on submitting MCV code示例。)它也没有引号",因此必须先添加它们才能用于测试。

        考虑到这些因素,以下内容会编译许多警告,但它会产生与您正在寻找的内容相匹配的输出。

        def getJsonKeyValue(mapIs: Map[String, _]): Unit = {
          mapIs.foreach {
            case (k: String, v: List[Map[String, _]]) => v.foreach(getJsonKeyValue)
            case (k: String, v: Map[String, _])       => getJsonKeyValue(v)
            case (k: String, v)                       => println(k + "=" + v)
          }
        }
        

        <强>更新

        这是一个返回字符串表示的版本。

        def getJsonKeyValue(mapIs: Map[String, _]): Iterable[String] = {
          mapIs.flatMap {
            case (k: String, v: List[Map[String, _]]) => v.flatMap(getJsonKeyValue)
            case (k: String, v: Map[String, _])       => getJsonKeyValue(v)
            case (k: String, v)                       => Iterable(k + "=" + v)
          }
        }