编写此代码的最佳方法是在Groovy中使用字符串映射转换

Dax*_*xon 14 string groovy map

我有一个字符串

def data = "session=234567893egshdjchasd&userId=12345673456&timeOut=1800000"
Run Code Online (Sandbox Code Playgroud)

我想将它转换为地图

 ["session", 234567893egshdjchasd]
 ["userId", 12345673456]
 ["timeout", 1800000]
Run Code Online (Sandbox Code Playgroud)

这是我现在这样做的方式,

 def map = [:]

 data.splitEachLine("&"){

   it.each{ x ->

     def object = x.split("=")
     map.put(object[0], object[1])

   }

 }
Run Code Online (Sandbox Code Playgroud)

它有效,但是有更有效的方法吗?

ig0*_*774 25

我不知道认为这会运行得更快,但它的确表现在语法简约性方面:

def data = 'session=234567893egshdjchasd&userId=12345673456&timeOut=1800000'
def result = data.split('&').inject([:]) { map, token -> 
    //Split at "=" and return map with trimmed values
    token.split('=').with { 
        map[it[0].trim()] = it[1].trim() 
    }
    map 
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,我喜欢Don的可读性和可维护性的答案,但根据具体情况,这可能是合适的.

编辑:这实际上是一个重新格式化的单行.

  • +1使用花哨的GDK方法(注入)和花哨的英语短语(句法简约) (4认同)
  • 你可以将注入内脏改为token.split('=').用{map << [([0]):它[1]]}如果你_really_讨厌可读性;-) (3认同)

Dón*_*nal 13

我不知道这是否更有效,但对我来说,它有点简单(YMMV)

def data = "session=234567893egshdjchasd&userId=12345673456&timeOut=1800000"
def map = [:]

data.split("&").each {param ->
    def nameAndValue = param.split("=")
    map[nameAndValue[0]] = nameAndValue[1]
}
Run Code Online (Sandbox Code Playgroud)

  • 我写了一个快速而肮脏的Groovy脚本(可能存在很大缺陷),比较了所提到的3种技术,并且Dons方法始终最快.它抓取3个不同长度的查询字符串,并为每个方法计时多长时间,输出例如:`方法1(ig0774)[124727794,2236178,4806756]总计:131770728方法2(唐)[2546134,1174801,2227867]总计:5948802方法3(Ted Naleid)[10447068,1915955,2840445]总计:15203468`足够我的目的 (2认同)

Ted*_*eid 6

如果您正在寻找高效的正则表达式,那就是它所在的位置:

def data = "session=234567893egshdjchasd&userId=12345673456&timeOut=1800000"
def map = [:]
data.findAll(/([^&=]+)=([^&]+)/) { full, name, value ->  map[name] = value }

println map
Run Code Online (Sandbox Code Playgroud)

打印:

[session:234567893egshdjchasd, userId:12345673456, timeOut:1800000]
Run Code Online (Sandbox Code Playgroud)

如果你不熟悉正则表达式,它可能看起来有点异国情调,但实际上并不复杂.它只有两个(组),第一组是任何字符,但是"&"或"=".第二组是除"="之外的任何字符.捕获组位于"="的两侧.