Kotlin中从列表移除另一列表元素的实现问题
移除list1中存在于list2的元素问题解决
你的代码逻辑搞反了:filter会保留lambda返回true的元素,而你写的list2.any { e2 == e1 }是判断当前元素存在于list2中,所以最终保留的是list1和list2的交集,得到[3,4,5]。要得到预期的[1,2,6],需要保留不存在于list2中的元素,只需要把条件取反即可。
快速修正版
直接对判断条件取反:
val list1 = listOf(1,2,3,4,5,6) val list2 = listOf(3,4,5,7,8) val l3 = list1.filter { e1 -> !list2.any { e2 -> e2 == e1 } } println(l3) // 输出 [1, 2, 6]
性能优化版
如果list2元素较多,用any每次遍历list2效率不高(时间复杂度O(n*m)),建议先把list2转成Set,利用Set的O(1)查询特性:
val list1 = listOf(1,2,3,4,5,6) val list2 = listOf(3,4,5,7,8) val list2Set = list2.toSet() val l3 = list1.filter { !list2Set.contains(it) } println(l3) // 输出 [1, 2, 6]
更简洁的写法
Kotlin集合支持-运算符,直接计算两个集合的差集,效果和上面一致:
val list1 = listOf(1,2,3,4,5,6) val list2 = listOf(3,4,5,7,8) val l3 = list1 - list2 println(l3) // 输出 [1, 2, 6]
内容的提问来源于stack exchange,提问作者WISHY
相关产品推荐
相关产品推荐

