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为该类设置新方法。
你这样做的方式没问题,但是当列表变大时,你可能想要这样做:
您可以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变大它不会变慢。