不同对象类型ArrayList对比及按remedy_id过滤列表的最优实现方法
不同对象类型ArrayList的最优对比过滤实现方案
最优实现思路
核心逻辑是用空间换时间降低时间复杂度,避免低效的双重遍历:
- 先从remedy列表中提取所有有效
remedy_id存入HashSet,利用Set的O(1)时间复杂度查询特性 - 用得到的有效id集合直接过滤adherence列表,总时间复杂度为
O(m + n)(m为remedy列表长度,n为adherence列表长度)
具体代码实现
首先明确两个输入列表的类型:
remedyList: ArrayList<ObjectA.Objecta>存储Remedy数据的列表adherencesList: ArrayList<ObjectB.Objectb>存储Adherence数据的待过滤列表
方案1:生成新的过滤后列表(不修改原列表,推荐)
// 第一步:提取所有有效remedy_id存入Set val validRemedyIds = remedyList.mapTo(mutableSetOf()) { it.remedy_id } // 第二步:过滤得到符合要求的adherence列表 val filteredAdherences = adherencesList.filter { it.remedy_id in validRemedyIds }
方案2:直接修改原adherencesList
val validRemedyIds = remedyList.mapTo(mutableSetOf()) { it.remedy_id } // 直接移除不符合要求的条目,Java 8+/Android API 24+ 支持 adherencesList.removeIf { it.remedy_id !in validRemedyIds } // 低版本兼容写法 val retainedList = adherencesList.filterTo(mutableListOf()) { it.remedy_id in validRemedyIds } adherencesList.clear() adherencesList.addAll(retainedList)
方案优势说明
- 性能远高于双重遍历/每次调用
remedyList.contains()的写法,后者时间复杂度为O(m*n),列表元素过千时性能差异会非常明显 - 自动处理remedy列表中
remedy_id重复的场景,Set自动去重不影响判断逻辑 - 代码简洁可读性高,符合Kotlin的函数式编程规范
内容的提问来源于stack exchange,提问作者Prophet Tech
相关产品推荐
相关产品推荐

