因此,我正在实现一个POM解析器。我已经达到了可以获取所有依赖项的程度,但有些工件可能会在不同版本中重复。比如gradle,我希望它只获取其中更高的版本。但在Kotlin中,我只能看到使用不接受条件的distinctBy函数删除重复项的示例。我想过滤掉版本最低的重复条目,保留版本最高的条目。我该怎么做?
我的列表中的条目如下
data class Artifact(val groupId: String, val artifactId: String, val version: String)
edit:例如,让列表如下所示
Artifact("com.squareup.okio", "okio-jvm", "3.2.0")
Artifact("org.jetbrains.kotlin", "kotlin-stdlib-jdk8", "1.6.20")
Artifact("org.jetbrains.kotlin", "kotlin-stdlib-common", "1.5.20")
Artifact("org.jetbrains.kotlin", "kotlin-stdlib-common", "1.6.21")
Artifact("org.jetbrains", "annotations", "13.0")
输出预计为
Artifact("com.squareup.okio", "okio-jvm", "3.2.0")
Artifact("org.jetbrains.kotlin", "kotlin-stdlib-jdk8", "1.6.20")
Artifact("org.jetbrains.kotlin", "kotlin-stdlib-common", "1.6.21")
Artifact("org.jetbrains", "annotations", "13.0")
即,移除副本中最低的版本
1条答案
按热度按时间guykilcj1#
这其中的主要部分相当简单明了:您可以使用
groupBy
按照组ID和工件ID对工件进行分组,然后使用maxBy
* 从每个组中选择最新版本。更棘手的部分是比较版本字符串... 但是luckily,Java stdlib有a class用于此!
因此,您只需:
(That由于 这些项是唯一的,但没有固有的顺序,因此对结果调用
toSet()
是有意义的......但我把它留给您!)(* 现在已经弃用
maxByOrNull()
,但为了简单起见,我忽略了它,因为这里的组永远不会为空。)(如果你没有运行在Kotlin/JVM上,那么你必须编写自己的版本号比较函数 。这有点麻烦,但也不太难。 -我认为您必须将字符串拆分成点,然后用数字对各个数字进行成对比较,但如果您必须处理非数字部分(如尾随的
a
或-SNAPSHOT
或补丁编号...... 如果您需要这样做,最好将其作为一个单独的问题)。