Groovy 可迭代组件删除最高版本
Groovy iterable component remove the highest version
我有以下脚本。此脚本适用于列表:
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>
而不是 list
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 }
- 在调用
sort
后将 removeAt
应用于集合的适当元素:
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]]
我有以下脚本。此脚本适用于列表:
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>
而不是 list
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 }
- 在调用
sort
后将removeAt
应用于集合的适当元素:
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]]