You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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) }

逻辑说明

  1. 辅助集合seenFemaleNames:专门记录已出现过的女性姓名,确保同一个女性姓名只保留首次出现的实例。
  2. 过滤逻辑:
    • 按原列表顺序遍历每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:42:04