2017-07-27 188 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]

相關問題