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]]

以下代码片段有效:

  1. 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 }
  1. 在调用 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]]