如何在Kotlin中基于patientID判断两个PatientData列表是否重复
如何判断两个可空PatientData列表是否基于patientID重复
嘿,我来帮你搞定这个问题!你之前用zip和contentEquals没生效其实是有明确原因的:
zip只会按索引一一配对两个列表的元素,如果两个列表长度不一样,超出的元素会直接被忽略,根本没法准确判断整体是否匹配;contentEquals是比较列表中每个元素的引用或完整equals结果——而你的PatientData是data class,默认的equals会比较所有字段(ID、姓名、电话),哪怕两个元素ID相同但姓名/电话不同,contentEquals也会返回false,完全不符合你只关心patientID的需求。
接下来分两种最常见的场景给你解决方案,你可以根据自己的实际需求选:
场景1:要求两个列表的元素顺序一致,且每个对应位置的patientID完全相同
这种情况要先处理空值和长度问题,再逐个比对ID:
fun areListsMatchingByID(list1: List<PatientData>?, list2: List<PatientData>?): Boolean { // 两个列表都为空,算匹配 if (list1 == null && list2 == null) return true // 一个空一个非空,直接不匹配 if (list1 == null || list2 == null) return false // 长度不一样,肯定没法对应位置匹配 if (list1.size != list2.size) return false // 逐个比对对应位置元素的patientID return list1.zip(list2).all { (itemFromList1, itemFromList2) -> itemFromList1.patientID == itemFromList2.patientID } }
这里先做了空值和长度校验,再用zip+all组合,就能避免之前zip截断的坑。
场景2:只要求两个列表的patientID集合完全相同(不关心顺序、不关心重复次数)
如果只要两个列表的ID去重后完全一致,不管元素顺序和重复出现的次数,用集合来处理最方便:
fun areIDsMatching(list1: List<PatientData>?, list2: List<PatientData>?): Boolean { // 提取list1的所有ID转为集合,空列表/Null则返回空集合 val idsFromList1 = list1?.map { it.patientID }?.toSet() ?: emptySet() // 同理处理list2 val idsFromList2 = list2?.map { it.patientID }?.toSet() ?: emptySet() // 直接比较两个集合是否相等 return idsFromList1 == idsFromList2 }
如果需要关心重复次数(比如list1里有2个"P001",list2也必须恰好有2个),那就用分组统计的方式:
fun areIDsWithCountMatching(list1: List<PatientData>?, list2: List<PatientData>?): Boolean { // 封装一个统计列表ID出现次数的工具函数 fun countIDOccurrences(list: List<PatientData>?): Map<String, Int> { return list?.groupingBy { it.patientID }?.eachCount() ?: emptyMap() } // 比较两个统计结果是否一致 return countIDOccurrences(list1) == countIDOccurrences(list2) }
这样根据你的实际业务需求选对应的方法就可以啦~
内容的提问来源于stack exchange,提问作者user14276848
相关产品推荐
相关产品推荐

