使用自定义相等函数在 Kotlin 中减去两个列表

655*_*536 3 list data-structures kotlin

我有两个列表,我想获取只包含第一个列表中不在第二个列表中的元素的列表。问题是我需要equal在减法时指定一个自定义。假设我想使用列表条目中的字段之一。让我们说id

我是这样实现的:

list1.filter { log -> list2.none { it.id == log.id } }
Run Code Online (Sandbox Code Playgroud)

或者

val projection = logEntries.map { it.id }
list1.filter { it.id !in projection }
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点?请考虑到我无法equal为该类设置新方法。

Wil*_*zel 5

你这样做的方式没问题,但是当列表变大时,你可能想要这样做:

您可以list2先将参考列表 ( ) 转换为一组,从而提高流程效率。

val referenceIds = list2.distinctBy { it.id }.toSet()

list1.filter { it.id !in referenceIds }
Run Code Online (Sandbox Code Playgroud)

背景:

ArrayList当您检查是否包含元素时,您最有可能使用的An的时间复杂度为 O(n)。因此,如果列表变大,则需要更长的时间。

HashSet另一方面,在检查是否包含元素时,A的时间复杂度为 O(1)。所以,如果list2变大它不会变慢。