2017-07-27 21 views
0

マップ文字列をグラスに変換します。私は既に文字列から変換への変換の機能を持っています。相続人は、コード、Grailsは文字列値のカンマで文字列をマップに変換します

static def StringToMap(String reportValues){ 
    Map result=[:] 
     result=reportValues.replace('[','').replace(']','').replace(' ','').split(',').inject([:]){map,token -> 
      List tokenizeStr=token.split(':'); 
      tokenizeStr.size()>1?tokenizeStr?.with {map[it[0]?.toString()?.trim()]=it[1]?.toString()?.trim()}:tokenizeStr?.with {map[it[0]?.toString()?.trim()]=''} 
      map 
     } 
    return result 
    } 

しかし、私は値をカンマで文字列を持っているので、上記の機能は私のために動作しません。 Heresの文字列

[program_type:, subsidiary_code:, groupName:, termination_date:, effective_date:, subsidiary_name:ABC, INC] 

my関数はABCのみを返します。 ABC、INCではなく私はそれについてgoogledしかしcouldntは具体的な助けを見つける。

答えて

1

一般に、Stringified MapをMapオブジェクトに変換する必要がある場合、私はEval.meを使用しようとします。あなたの例の文字列は、しかし、そうするために非常に適切ではありません、あなたは持っていたならば、それは「ただ働き」です以下:

// Note I have added '' around the values. 
​String a = "[program_type:'', subsidiary_code:'', groupName:'', termination_date:'', effective_date:'', subsidiary_name:'ABC']" 
Map b = Eval.me(a)​ 
// returns b = [program_type:, subsidiary_code:, groupName:, termination_date:, effective_date:, subsidiary_name:ABC] 

あなたは[文字列のコントロールを持っている場合は、パターンのこの種の次にそれを作成することができる場合私が疑う最も簡単な解決策になるでしょう。

+0

Isnt文字列の値を変更する必要があるため、正確に答えが必要でしたが、 –

1

入力パラメータを変更できない場合は、これはきれいでなく、短いオプションではない可能性があります。カンマ値の代わりにコロンを使用します。

​String reportValues = "[program_type:, subsidiary_code:, groupName:, termination_date:, effective_date:, subsidiary_name:ABC, INC]" 
reportValues = reportValues[1..-2] 
def m = reportValues.split(":") 
def map = [:] 
def length = m.size() 
m.eachWithIndex { v, i -> 
    if(i != 0) { 
     List l = m[i].split(",") 
     if (i == length-1) { 
      map.put(m[i-1].split(",")[-1], l.join(",")) 
     } else { 
      map.put(m[i-1].split(",")[-1], l[0..-2].join(",")) 
     } 
    } 
} 
map.each {key, value -> println "key: " + key + " value: " + value} 

BTW:信頼できる入力にのみevalを使用し、AFAIKはすべてを実行します。

0

あなたはこのコードのビットをいじり試みることができる:

String tempString = "[program_type:11, 'aa':'bb', subsidiary_code:, groupName:, termination_date:, effective_date:, subsidiary_name:ABC, INC]" 
     List StringasList = tempString.tokenize('[],') 
     def finalMap=[:] 
     StringasList?.each { e-> 
      def f = e?.split(':') 
      finalMap."${f[0]}"= f.size()>1 ? f[1] : null 

     } 
     println """-- tempString: ${tempString.getClass()} StringasList: ${StringasList.getClass()} 
         finalMap: ${finalMap.getClass()} \n Results\n finalMap ${finalMap} 
      """ 

以上が生成する:

-- tempString: class java.lang.String StringasList: class java.util.ArrayList 
         finalMap: class java.util.LinkedHashMap 
Results 
finalMap [program_type:11, 'aa':'bb', subsidiary_code:null, groupName:null, termination_date:null, effective_date:null, subsidiary_name:ABC, INC:null] 

それは文字列、リストを反復処理し、再び分割し、それぞれを渡すことによって、ArrayListに変換しトークン化:に対してマップに追加します。また、サイズが1より大きいかどうかをチェックする必要があります。それ以外の場合は破損します。f[1]

関連する問題