遍历对象数组时如何判定当前元素为同条件下的最优匹配对象
Kotlin 遍历对象数组时筛选同姓名最大年龄对象的实现方案
最优实现思路为:先预计算每个姓名对应的重名状态和最大年龄,再遍历数组实时判断,时间复杂度为O(n),性能表现最好,实现代码如下:
首先是示例使用的基础定义:
data class Person(val name: String, val age: Int) // 示例数组 val pers1 = Person("Jake", 22) val pers2 = Person("Oliver", 25) val pers3 = Person("Mark", 35) val pers4 = Person("John", 35) val pers5 = Person("Mark", 55) val persons = arrayOf(pers1, pers2, pers1, pers3, pers4, pers5)
核心实现代码:
// 预计算每个姓名的元信息:是否重名、对应最大年龄 val nameMetadata = persons.groupBy { it.name } .mapValues { (_, sameNameList) -> Pair( first = sameNameList.size > 1, // 判断当前姓名是否存在重名 second = sameNameList.maxOf { it.age } // 取当前姓名对应的最大年龄 ) } // 遍历数组实时判定 for (person in persons) { val (isDuplicated, maxAge) = nameMetadata.getValue(person.name) // 满足双条件:存在重名 + 是当前姓名下年龄最大的对象 if (isDuplicated && person.age == maxAge) { // 此处执行你的后续操作 println("待处理对象:$person") } }
如果不需要预计算,想要在单次遍历中实时查询(仅适合极小数据量场景,时间复杂度为O(n²),数据量大时性能损耗严重),可以用如下实现:
for (person in persons) { val sameNamePersons = persons.filter { it.name == person.name } val isDuplicated = sameNamePersons.size > 1 val isOldest = sameNamePersons.all { it.age <= person.age } if (isDuplicated && isOldest) { // 执行后续操作 } }
内容的提问来源于stack exchange,提问作者TiGer
相关产品推荐
相关产品推荐

