使用Kotlin中的条件从列表中删除重复条目

ao218c7q  于 2022-12-27  发布在  Kotlin
关注(0)|答案(1)|浏览(197)

因此,我正在实现一个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")

即,移除副本中最低的版本

guykilcj

guykilcj1#

这其中的主要部分相当简单明了:您可以使用groupBy按照组ID和工件ID对工件进行分组,然后使用maxBy * 从每个组中选择最新版本。
更棘手的部分是比较版本字符串... 但是luckily,Java stdlib有a class用于此!
因此,您只需:

import java.lang.module.ModuleDescriptor.Version

data class Artifact(val groupId: String, val artifactId: String, val version: String)

fun main() {
    // Some simple sample data:
    val deps = listOf(Artifact("gp", "art", "9.2"), Artifact("gp", "art", "9.10"), Artifact("gp", "art", "10.0"), Artifact("gp2", "art2", "1.0"))

    // Find the latest version of each dependency:
    val latestDeps = deps.groupBy{ it.groupId to it.artifactId }.values
                         .map{ it.maxBy{ Version.parse(it.version) }}

    // And display the result:
    println(latestDeps)
}

(That由于 这些项是唯一的,但没有固有的顺序,因此对结果调用toSet()是有意义的......但我把它留给您!)
(* 现在已经弃用maxByOrNull(),但为了简单起见,我忽略了它,因为这里的组永远不会为空。)
(如果你没有运行在Kotlin/JVM上,那么你必须编写自己的版本号比较函数 。这有点麻烦,但也不太难。 -我认为您必须将字符串拆分成点,然后用数字对各个数字进行成对比较,但如果您必须处理非数字部分(如尾随的a-SNAPSHOT或补丁编号...... 如果您需要这样做,最好将其作为一个单独的问题)。

相关问题