Kotlin如何按指定规则去除对象列表重复元素并维持顺序
Kotlin 实现仅女性按姓名去重并保留列表原顺序
需求回顾
现有如下定义的Person数据类和personList列表:
data class Person(val id: Int, val name: String, val gender: String) val personList = listOf( Person(1, "Alice", "female"), Person(2, "Bob", "male"), Person(3, "Charlie", "female"), Person(4, "Bob", "male"), Person(5, "Diana", "female"), Person(6, "Eve", "male"), Person(7, "Charlie", "female") // 需要移除的项,和Person3同名且为female )
要求:仅对gender为female的项按name去重(保留第一个出现的实例),male项允许同名;必须维持列表原有顺序,最终得到移除Person7后的结果列表。
解决方案代码
可以通过遍历列表结合辅助集合实现需求,代码如下:
val seenFemaleNames = mutableSetOf<String>() val filteredList = personList.filter { person -> if (person.gender == "female") { seenFemaleNames.add(person.name) // 集合新增成功则返回true,说明是首次出现的女性姓名 } else { true // 男性项直接保留,允许同名 } } // 打印验证结果 filteredList.forEach { println(it) }
逻辑说明
- 辅助集合
seenFemaleNames:专门记录已出现过的女性姓名,确保同一个女性姓名只保留首次出现的实例。 - 过滤逻辑:
- 按原列表顺序遍历每个
Person实例,保证结果顺序和原列表一致。 - 女性实例:利用
MutableSet.add()的返回值判断姓名是否首次出现,首次出现则保留并记录姓名,重复则跳过。 - 男性实例:直接保留,不做去重限制。
- 按原列表顺序遍历每个
输出结果
运行代码后,filteredList的内容为:
Person(id=1, name=Alice, gender=female) Person(id=2, name=Bob, gender=male) Person(id=3, name=Charlie, gender=female) Person(id=4, name=Bob, gender=male) Person(id=5, name=Diana, gender=female) Person(id=6, name=Eve, gender=male)
完全符合需求:重复的女性实例Person7被移除,男性同名项(Bob)保留,列表顺序与原列表一致。
内容的提问来源于stack exchange,提问作者Doo9104
相关产品推荐
相关产品推荐

