2017-07-27 182 views
0

我想在字符串中将字符串转换为Map。我已经有一个字符串映射转换的函数。继承人的代码,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 
    } 

但是,我有字符串逗号的值,所以上述功能不适用于我。继承人我的字符串

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

我的函数只返回ABC。不是ABC,INC。我搜索了它,但没有找到任何具体的帮助。

回答

1

一般来说,如果我必须将一个字符串化地图转换为一个地图对象,我尝试使用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]

相关问题