全部删除 - 修改源列表



在我的项目中,我使用了两次removeAll方法。第二次我必须使用列表的副本,因为源列表是通过第一次使用 removeAll 方法修改的。有什么方法可以在不复制列表的情况下做到这一点?

val apiIdListCopy: MutableList<Int> = apiIdList
apiIdList.removeAll(dbIdList)
dbIdList.removeAll(apiIdListCopy)

编辑:对于未来的观众,我在 Kotlin 中找到了更简单的解决方案

val api: List<Int> = apiIdList.stream().filter{item -> !dbIdList.contains(item)}.collect(Collectors.toList())
val db: List<Int> = dbIdList.stream().filter{item -> !apiIdList.contains(item)}.collect(Collectors.toList())

您所需要的一切都已经由 Kotlin 提供:

val onlyInApi = apiIdList - dbIdList
val onlyInDb = dbIdList - apiIdList

-运算符适用于 Iterable ,因此您可以将其应用于列表或集。请注意,它在引擎盖下使用套装,因此它与使用Guava的Sets.difference一样有效。

在我看来

,您真正想要实现的是这两个列表之间的差异。除非列表非常短,否则您尝试这样做的方式效率极低,因为删除时 n^2 的复杂性。

我的建议是使用Set而不是List,然后使用番石榴集方法:

SetView<Integer> onlyInApi = Sets.difference(apiIdSet, dbIdSet);
SetView<Integer> onlyInDb = Sets.difference(dbIdSet,apiIdSet);

这样,您可以创建包含您感兴趣的两个集合之间的差异的集合,但实际上没有执行副本(因为它们是视图并且仍然由原始集合支持(。

上面的例子是java,而不是kotlin,但转换应该是微不足道的。

最新更新