groovy - Groovy 可迭代组件移除最高版本
问题描述
我有以下脚本。此脚本适用于列表:
def list = ["3.5.0", "3.0.1", "3.0.0", "2.5.0", "2.0.0", "1.5.1", "1.5.0", "1.0.1", "1.0.0",
"1.0.10", "1.0.11", "1.0.2", "1.0.3", "1.0.4", "1.0.5", "1.0.6", "1.0.7", "1.0.8", "1.0.9"]
def versions = new ArrayList<> (
list
.sort()
.groupBy {
it.substring(0, it.lastIndexOf('.'))
}.values()
)
.each { it.sort{ a,b -> Integer.compare(
Integer.parseInt(a.substring(a.lastIndexOf('.') + 1)),
Integer.parseInt(b.substring(b.lastIndexOf('.') + 1))
)}.removeAt(it.size() - 1) }
versions.removeIf { it.empty }
versions.each {println it }
我想让它改为使用iterable<Component>
列表
def components = '''\
artifact 7.0.0
artifact 6.5.1
artifact 6.5.0
artifact 6.0.0
artifact 5.5.1
artifact 5.5.4
artifact 5.5.5
artifact 5.5.0
artifcat 5.5.2
artifcat 5.5.3
'''.readLines()*.tokenize(' ').collect { name, version ->
[name: name, version: version]
}
我将代码更改为此,但不删除最高版本
def components = '''\
artifact 7.0.0
artifact 6.5.1
artifact 6.5.0
artifact 6.0.0
artifact 5.5.1
artifact 5.5.4
artifact 5.5.5
artifact 5.5.0
artifcat 5.5.2
artifcat 5.5.3
'''.readLines()*.tokenize(' ').collect { name, version ->
[name: name, version: version]
}
def sorted = components.sort { a, b ->a
def f = { it.version.tokenize('.')*.toInteger() }
[f(a), f(b)].transpose().findResult { ai, bi ->
ai <=> bi ?: null
} ?: a.version <=> b.version
}
def versions = new ArrayList<> (
sorted
.groupBy {
it.version.substring(0, it.version.lastIndexOf('.'))
}.values()
)
.each { it.version.sort{ a,b -> Integer.compare(
Integer.parseInt(a.substring(a.lastIndexOf('.') + 1)),
Integer.parseInt(b.substring(b.lastIndexOf('.') + 1))
)}.removeAt(it.size() - 1) }
versions.removeIf { it.empty }
versions.each { c ->
println c
}
这是脚本的结果
[[name:artifact, version:5.5.0], [name:artifact, version:5.5.1], [name:artifcat, version:5.5.2], [name:artifcat, version:5.5.3], [name:artifact, version:5.5.4], [name:artifact, version:5.5.5]]
[[name:artifact, version:6.0.0]]
[[name:artifact, version:6.5.0], [name:artifact, version:6.5.1]]
[[name:artifact, version:7.0.0]]
这是预期的结果
[[name:artifact, version:5.5.0], [name:artifact, version:5.5.1], [name:artifcat, version:5.5.2], [name:artifcat, version:5.5.3], [name:artifact, version:5.5.4]]
[[name:artifact, version:6.5.0]]
解决方案
以下代码片段有效:
versions
应按内部属性正确排序以应用.removeAt
:
def versions = new ArrayList<> (
sorted
.groupBy {
it.version.substring(0, it.version.lastIndexOf('.'))
}.values()
)
.each { it.sort { a,b -> Integer.compare(
Integer.parseInt(a.version.substring(a.version.lastIndexOf('.') + 1)),
Integer.parseInt(b.version.substring(b.version.lastIndexOf('.') + 1))
)}.removeAt(it.size() - 1) }
versions.removeIf { it.empty }
versions.each { println it }
- 调用后应用于
removeAt
集合的适当元素sort
:
def versions = new ArrayList<> (
sorted
.groupBy {
it.version.substring(0, it.version.lastIndexOf('.'))
}.values()
)
.each { it.version.sort { a,b -> Integer.compare(
Integer.parseInt(a.substring(a.lastIndexOf('.') + 1)),
Integer.parseInt(b.substring(b.lastIndexOf('.') + 1))
)}
it.removeAt(it.size() - 1)
}
无论如何输出:
[[name:artifact, version:5.5.0], [name:artifact, version:5.5.1], [name:artifcat, version:5.5.2], [name:artifcat, version:5.5.3], [name:artifact, version:5.5.4]]
[[name:artifact, version:6.5.0]]
推荐阅读
- javascript - 加载部分在第一次加载时不会消失
- reactjs - 为什么这个组件在转换为 React-Hooks 时不起作用?(对此状态和解构部分感到困惑)
- angular - Ionic firstore 获取集合的具体数据
- bash - 如何在bash中的同一行读取多个整数?
- c - How can I point this string to the structure?
- r - 在(光栅)填充轮廓图上覆盖 shapfile
- java - 如何解析传入流,其中一个片段决定了另一个在 Java 中的解释?
- python - Scrapy:无法正确抓取 UPC 编号
- php - 如何从“主题宫博客日记”主题中删除页脚信用?
- r - 在 ggplot2 上创建多线图的问题