Groovy шаблон карты - PullRequest
       8

Groovy шаблон карты

0 голосов
/ 14 января 2019

Я пытаюсь создать отличный скрипт, который читает файл json

"Std": { "isAbstract": true, "jdk": "8", "mvn": "3.5.4" },  
"StdInstall": { "isAbstract": true, "inherits": ["Std"], "mvnCmd": "clean install" }, 
"StdDeploy": { "isAbstract": true, "inherits": ["Std"], "mvnCmd": "clean deploy" }, 
"WDF2": { "isAbstract": true, "svn": "http://..." },
"WDF2_install": { "inherits": ["WDF2", "StdInstall"] },
"WDF2_deploy": { "inherits": ["WDF2", "StdDeploy"] }

и пытается создать новую карту, которая заменит все наследуемые ключи правильными значениями из карты Сэма например, json будет выглядеть так в выводе

"Std": { "isAbstract": true, "jdk": "8", "mvn": "3.5.4" },
"StdInstall": { "isAbstract": true, "jdk": "8", "mvn": "3.5.4", "mvnCmd": "clean install" },
"StdDeploy": { "isAbstract": true, "jdk": "8", "mvn": "3.5.4", "mvnCmd": "clean deploy" },  
"WDF2": { "isAbstract": true, "svn": "http://..." }, 
"WDF2_install": { "isAbstract": true, "svn": "http://...", "jdk": "8", "mvn": "3.5.4", "mvnCmd": "clean install" },

"WDF2_deploy": { "isAbstract": true, "svn": "http://...", "jdk": "8", "mvn": "3.5.4", "mvnCmd": "clean deploy" }

Тем самым заменяя все наследуемые ключи на правильные значения из той же карты и удаляя дубликаты.

Я придумал первый бит кода, но не смог продолжить

def result = new LinkedHashMap(temp)

temp.each{ k, v ->
v.each{
k1,v1 -> 
if(k1 == "inherits" ){ 
    v1.each{ val->
    val = temp[val]
    println k

    def new1= v+val
    println new1
      //result = v+temp[v2] 
      //println result
    } 


} 
} 
}

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 14 января 2019

Я уверен, что другие найдут лучшие решения, но до сих пор я придумал это:

def result = temp.collectEntries {k,v ->
  if (v instanceof Map) {
    v = new HashMap(v)
    (v.remove("inherits")?:[]).each {ref -> v << temp[ref]}
  }
  [(k):v]

}

Каким-то образом мне не удалось избавиться от instanceof ... Во всяком случае ... основная идея заключается в том, что json считывает результаты в Map (если вы используете Groovy JSON, это, безусловно, так). collectEntries создаст новую карту из старой, предоставляя карты для каждой записи или записи карты. Я выбрал карты. v << temp [ref] добавит все записи карты, найденные в temp [ref], в v. v.remove ("наследует") удаляет запись наследования, но также дает мне значение, которое карта имела для этого ранее. v.remove ("наследует")?: [] гарантирует, что я всегда получу ненулевой список, даже если запись не существует. Если он существует, я расширяю карту «каждым», если нет, то ничего не происходит. Наконец, я создаю новую «частичную карту» с помощью [(k): v], которая принимает значение k для ключа и значение v для значения моего частичного. [k: v] создаст карту с ключом с именем k. </p>

Конечно, это может быть легко расширено для рекурсивной работы при необходимости:

def replacer
replacer = {k,v ->
  if (v instanceof Map) {
    v = new HashMap(v)
    (v.remove("inherits")?:[]).each {ref -> v << temp[ref]}
    v = v.collectEntries replacer
  }
  [(k):v]
}
def result = temp.collectEntries replacer

РЕДАКТИРОВАТЬ: исправлена ​​версия из-за комментария:

def result = temp.collectEntries {k,v ->   
  if (v instanceof Map) {
    v = new HashMap(v)
    def inherits = []
    while (true) {
      inherits +=  v.remove("inherits")?:[]
      if (!inherits) break
      v << temp[inherits.pop()]
    }
  }
  [(k):v] 
} 

с Groovy 3 вы также можете использовать do-while ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...