gpt4 book ai didi

list - 通过比较每种类型的值,从另外两个不同类型的列表中创建一个新列表

转载 作者:行者123 更新时间:2023-12-04 16:58:08 25 4
gpt4 key购买 nike

我有两个对象列表,它们都实现了一个接口(interface),但在其他方面不相关。如何创建一个新的对象集合,其中仅包含一个列表中与另一个列表中的值匹配的对象?

显然我可以使用 for 循环并手动执行此操作,但我想知道如何使用 Kotlin 的标准库集合过滤功能来执行此操作。

所以这里有一个例子:

interface Ids
{
val id: Int
}

data class A(override val id: Int, val name: String) : Ids
data class B(override val id: Int, val timestamp: Long) : Ids

fun main(args: Array<String>) {
val a1 = A(1, "Steve")
val a2 = A(2, "Ed")
val aCol = listOf(a1, a2)

val b2 = B(2, 12345)
val b3 = B(3, 67890)
val bCol = listOf(b2, b3)

val matches = mutableListOf<B>()
// This is where I'm stuck.
// I want to filter bCol using objects from aCol as a filter.
// The result should be that matches contains only a single object: b2
// because bCol[0].id == aCol[1].id
// I'm guessing I need to start with something like this:
bCol.filterTo(matches) { ??? }
}

最佳答案

一种直接的方法是搜索 aCol对于每个 b 具有相同 ID 的对象在 bCol :

bCol.filter { b -> aCol.any { a -> a.id == b.id } }

但是,如果您的列表足够大,这可能会变得太慢。

为了使其更具可扩展性,您可以首先在 aCol 中构建一组所有 ID。 :
val aColIds = aCol.map { it.id }.toSet()

然后使用 Set.contains判断 b.id的方法在 aColIds :
bCol.filter { it.id in aColIds }
// or equivalent
bCol.filter { aColIds.contains(it.id) }

关于list - 通过比较每种类型的值,从另外两个不同类型的列表中创建一个新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44813905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com