如何在Kotlin中按第一个列表的顺序获取两列表交集
Kotlin 两个列表求交集并保持首列表顺序的实现
要实现同时存在于两个列表中、且输出顺序与第一个列表一致的需求,核心思路是过滤第一个列表,只保留在第二个列表中存在的元素,同时通过集合优化查询效率,具体实现如下:
最优实现(兼顾效率与简洁)
val first = listOf(1, 2, 3, 4, 5,7,9,15,11) val second = listOf(2, 15 , 4,3, 11) // 将第二个列表转为Set,把O(n)的查询操作优化为O(1) val secondElementSet = second.toSet() val output = first.filter { secondElementSet.contains(it) } println(output) // 输出结果:[2, 3, 4, 15, 11]
原理说明
filter函数会严格按照第一个列表的元素顺序遍历,保留满足条件的元素,完美匹配顺序要求。- 把第二个列表转为
Set是关键优化:如果直接用first.filter { it in second },每次判断都要遍历第二个列表(时间复杂度O(n*m)),而Set的contains操作是常数时间,大数据量下性能提升明显。
处理重复元素场景
如果第一个列表存在重复元素,只要第二个列表包含该元素,重复项会被完整保留(符合顺序要求):
val first = listOf(2, 2, 3, 3, 4) val second = listOf(2, 3) val secondSet = second.toSet() val output = first.filter { secondSet.contains(it) } println(output) // 输出结果:[2, 2, 3, 3]
内容的提问来源于stack exchange,提问作者MARSH
相关产品推荐
相关产品推荐

