我有两个列表,我想获取只包含第一个列表中不在第二个列表中的元素的列表。问题是我需要在减法时指定一个自定义的 equal
。假设我想使用列表条目中的字段之一。假设 id
。
我是这样实现的:
list1.filter { log -> list2.none { it.id == log.id } }
或者
val projection = logEntries.map { it.id }
list1.filter { it.id !in projection }
有没有更好的方法来做到这一点?请考虑到我无法为该类设置新的
equal
方法。
最佳答案
你这样做的方式没问题,但是当列表变大时,你可能想要这样做:
您可以先将引用列表 ( list2
) 转换为一组,从而提高流程效率。
val referenceIds = list2.distinctBy { it.id }.toSet()
list1.filter { it.id !in referenceIds }
背景:
当您检查是否包含元素时,您最有可能使用的
ArrayList
的时间复杂度为 O(n)。因此,如果列表变大,则需要更长的时间。另一方面,在检查是否包含元素时,
HashSet
的时间复杂度为 O(1)。所以,如果 list2
变大,它不会变慢。
关于list - 使用自定义相等函数在 Kotlin 中减去两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54513010/