首页 > 解决方案 > 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]]

标签: groovycollections

解决方案


以下代码片段有效:

  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. 调用后应用于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]]

推荐阅读