在Kotlin中如何去除列表中的重复元素?有哪些实现方式?
Kotlin列表去除重复元素实现方案
Kotlin标准库内置了专用的去重函数,也可以通过for循环手动实现逻辑,两种方式都可以满足需求,具体实现如下:
1. 使用标准库内置函数实现(推荐)
Kotlin的Iterable接口默认提供了distinct()扩展函数,可直接完成去重,依赖元素的equals()和hashCode()方法判断重复,会保留元素第一次出现的顺序。
基础使用示例
针对你给出的carList场景,可按以下方式使用:
val carList = mutableListOf<Cars>() carList.add(randomCar()) // 方案1:生成新的去重后的不可变列表,原列表保持不变 val distinctCars = carList.distinct() // 方案2:直接修改原可变列表,原地完成去重 carList.apply { clear() addAll(distinctCars) }
按指定字段去重
如果需要按照对象的某一个属性判断重复(比如按车辆ID、车牌等),可以使用distinctBy()函数,示例:
// 按车辆id属性去重 val distinctById = carList.distinctBy { it.carId }
2. 使用for循环手动实现
如果需要自定义去重逻辑,不依赖标准库函数,也可以通过遍历+临时集合的方式实现,逻辑如下:
val carList = mutableListOf<Cars>() carList.add(randomCar()) val existedCars = hashSetOf<Cars>() val filteredList = mutableListOf<Cars>() // 遍历原列表,仅保留第一次出现的元素 for (car in carList) { if (car !in existedCars) { existedCars.add(car) filteredList.add(car) } } // 如需修改原列表,执行以下代码 carList.clear() carList.addAll(filteredList)
注意事项
- 无论使用哪种方案,都需要确保
Cars类正确实现equals()和hashCode()方法:如果是Kotlin的data class,编译器会自动根据主构造参数生成这两个方法,无需额外处理;如果是普通类,需要手动重写,否则会默认按对象内存地址判断重复,即使属性完全一致的两个实例也会被识别为不同元素。 - 上述所有实现都默认保留元素在原列表中第一次出现的顺序,符合绝大多数业务场景需求。
内容的提问来源于stack exchange,提问作者Divyanshu
相关产品推荐
相关产品推荐

