Лучший способ кодировать это, представьте в виде строки для отображения преобразования в Groovy

У меня есть строка как

def data = "session=234567893egshdjchasd&userId=12345673456&timeOut=1800000"

Я хочу преобразовать его в карту

 ["session", 234567893egshdjchasd]
 ["userId", 12345673456]
 ["timeout", 1800000]

Это - текущий способ, которым я делаю его,

 def map = [:]

 data.splitEachLine("&"){

   it.each{ x ->

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

   }

 }

Это работает, но является там более эффективным путем?

14
задан Daxon 11 May 2010 в 16:50
поделиться

3 ответа

Я не знаю, думаю, что это будет работать быстрее, но с точки зрения синтаксической экономичности это говорит само за себя:

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 
}

Лично мне нравится Дона ответ за удобочитаемость и ремонтопригодность, но в зависимости от контекста это может быть подходящим.

Изменить: На самом деле это переформатированный однострочный файл.

25
ответ дан 1 December 2019 в 06:18
поделиться

Я не знаю, является ли это более эффективным, но на мой взгляд, это немного проще (YMMV)

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

data.split("&").each {param ->
    def nameAndValue = param.split("=")
    map[nameAndValue[0]] = nameAndValue[1]
}
13
ответ дан 1 December 2019 в 06:18
поделиться

Если вы ищете эффективные методы, то регулярные выражения - это то, что нужно:

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

println map

печатает:

[session:234567893egshdjchasd, userId:12345673456, timeOut:1800000]

Если вы не знакомы с регулярными выражениями, это может показаться немного странным, но на самом деле все не так сложно. У него всего две группы (группы), первая группа - это любой символ, кроме "&" или "=". Вторая группа - это любой символ, кроме "=". Группы захвата находятся по обе стороны от "=".

6
ответ дан 1 December 2019 в 06:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: