2017-03-29 40 views
-4

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 
+1

正確には何ですか? – Harald

+0

@ハラルド私の問題は、基本的にはキーと値を出力する関数getJsonKeyValueを持っています。私はgetJsonKeyValueから戻り値を得ることができません。 –

+0

このコードは、投稿されているため、コンパイルできません。コンパイルして実行するコードに問題がある場合は、それを投稿する必要があります。 – jwvh

答えて

0

はこの不十分に構成された質問の多くの問題。私は重症度の順に説明します。

  1. case (k: String, v: Any) => (k + "=" + v)

この行はStringを返しますが、周囲のforeach()戻っUnitはので、この結果の文字列が捨てられています。 1)結果文字列を収集するためにforeachの代わりにmap(またはその他の収集操作)を使用するか、または2)println()を使用して結果文字列を出力します。 printlnは、foreachの結果に一致するUnitを返します。

  1. データ型が不明です。

サンプルデータには、コードと予想される出力が考慮していないString->Mapというエントリが含まれています。

  1. フォーマットされていないサンプルデータが少なすぎます。

あなたの問題を説明するのに必要な出力と方法以上に必要なものより多くのサンプルデータを提供しました。 (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) 
    } 
} 
+0

お返事ありがとうございます、私はprintlnを使用したくない場合があります。 getJsonKeyValueがメインプログラム内ですべての値を出力する場所を宣言している場合、現在何が起こっているのですか?このprintln(getJsonKeyValue)のように記述すると、getJsonKeyValue関数にすべての値が格納されます。 –

+0

@thehacker、私の更新を参照してください。 – jwvh

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 
    } 
} 
+0

私は上記のコードを使用して、私の入力と同じ出力を得ています。期待どおりの出力が見えますか? –

関連する問題