首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy合并YAML文件删除重复

Groovy合并YAML文件删除重复
EN

Stack Overflow用户
提问于 2021-03-04 17:21:14
回答 1查看 374关注 0票数 0

我想要合并配置文件:

代码语言:javascript
复制
tool:
 jdk:
 - name: jdk8
   version: 8
 - name: jdk11
   version: 11

带档案:

代码语言:javascript
复制
tool:
  jdk:
 - name: jdk11
   version: 11
 - name: jdk15
   version: 15

因此,我期望:

代码语言:javascript
复制
tool:
 jdk:
 - name: jdk8
   version: 8
 - name: jdk11
   version: 11
 - name: jdk15
   version: 15

没有副本。Am目前正在使用@stepniak:https://e.printstacktrace.blog/how-to-merge-two-maps-in-groovy/#merge-maps-with-nested-maps的解决方案。

你知道我怎么才能避免重复吗?

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-05 10:10:09

以下代码:

代码语言:javascript
复制
import groovy.yaml.*

def dataA = '''\
tool:
  jdk:
    - name: jdk8
      version: 8
    - name: jdk11
      version: 11
'''

def dataB = '''\
tool:
  jdk:
    - name: jdk11
      version: 11
    - name: jdk15
      version: 15
'''

def parser = new YamlSlurper()

def a = parser.parseText(dataA)
def b = parser.parseText(dataB)

def c = [tool: [jdk: (a.tool.jdk + b.tool.jdk).unique()]]

println "a: $a"
println "b: $b"
println "c: $c"

def builder = new YamlBuilder() 
builder c

println(builder)

当运行时,结果是:

代码语言:javascript
复制
─➤ groovy solution.groovy
a: [tool:[jdk:[[name:jdk8, version:8], [name:jdk11, version:11]]]]
b: [tool:[jdk:[[name:jdk11, version:11], [name:jdk15, version:15]]]]
c: [tool:[jdk:[[name:jdk8, version:8], [name:jdk11, version:11], [name:jdk15, version:15]]]]
---
tool:
  jdk:
  - name: "jdk8"
    version: 8
  - name: "jdk11"
    version: 11
  - name: "jdk15"
    version: 15

这个解决方案并不是很通用的,因为我们硬编码x.tool.jdk路径。另一种方法是编写某种递归合并函数,它可以以更通用的方式完成。

注释后的更新:

对于评论中的问题,您可以这样做:

代码语言:javascript
复制
def a = [tool: [jdk: [installations:
          [[name: 'latest-11', 
            properties: [[installSource: [installers:[[zip:[subdir:'jdk-11.999', url:'https://artifactory/OpenJDK11U_11.0.3_7.tar.gz']]]]]]]]]]] 

def b = [tool: [jdk: [installations:
          [[name: 'latest-11',  properties: [[installSource:[installers:[[zip:[subdir:'jdk-11.37', url:'https://artifactory/OpenJDK11U_11.0.3_7.tar.gz']]]]]]], 
           [name: 'jdk-11.0.3', properties: [[installSource:[installers:[[zip:[subdir:'jdk-11.3', url:'https://artifactory/OpenJDK11U_11.0.3_7.tar.gz']]]]]]]]]]]

def uniqueInstallations = (a.tool.jdk.installations + b.tool.jdk.installations).toUnique { x, y -> x.name <=> y.name }
def c = [tool: [jdk: [installations: uniqueInstallations]]]

uniqueInstallations.each { 
  println it
}

println "=="
println c

其中的指纹:

代码语言:javascript
复制
➤ groovy solution2.groovy
[name:latest-11, properties:[[installSource:[installers:[[zip:[subdir:jdk-11.999, url:https://artifactory/OpenJDK11U_11.0.3_7.tar.gz]]]]]]]
[name:jdk-11.0.3, properties:[[installSource:[installers:[[zip:[subdir:jdk-11.3, url:https://artifactory/OpenJDK11U_11.0.3_7.tar.gz]]]]]]]
==
[tool:[jdk:[installations:[[name:latest-11, properties:[[installSource:[installers:[[zip:[subdir:jdk-11.999, url:https://artifactory/OpenJDK11U_11.0.3_7.tar.gz]]]]]]], [name:jdk-11.0.3, properties:[[installSource:[installers:[[zip:[subdir:jdk-11.3, url:https://artifactory/OpenJDK11U_11.0.3_7.tar.gz]]]]]]]]]]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66479924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档