1. 概述
在本教程中,我们将学习如何在 Kotlin 中从数组中去除重复值。
这在处理字符串数组、对象数组等场景中非常常见,比如在数据清洗、去重逻辑处理等环节。Kotlin 提供了多种简洁的内置函数来实现这一点,我们将会介绍其中三种最常用的方法。
2. 使用 toMutableSet
扩展函数
在处理重复值时,最直接的方式是利用 Set 集合不允许重复元素 的特性。
Kotlin 提供了 toMutableSet()
扩展函数,可以将数组快速转换为一个可变的 MutableSet
。由于 Set 本身不允许重复值,因此结果会自动去重。
示例代码如下:
val data = arrayOf("pie", "tie", "lie", "pie")
val uniqueData = data.toMutableSet()
assertEquals(3, uniqueData.size)
assertTrue(uniqueData.contains("pie"))
assertTrue(uniqueData.contains("tie"))
assertTrue(uniqueData.contains("lie"))
✅ 优点:代码简洁,去重效率高
❌ 缺点:无法保留原始顺序
踩坑提醒:如果你需要保留原始顺序,不建议使用这个方法。
3. 使用 distinct
扩展函数
Kotlin 还提供了 distinct()
函数,用于返回一个包含唯一元素的 List
。
与 toMutableSet()
不同的是,distinct()
会保留原始数组中元素的顺序,并且只保留第一个出现的元素,后续重复项会被忽略。
val data = arrayOf("pie", "tie", "lie", "pie")
assertEquals(4, data.size)
val uniqueData = data.distinct()
assertEquals(3, uniqueData.size)
assertEquals("pie", uniqueData[0])
assertEquals("tie", uniqueData[1])
assertEquals("lie", uniqueData[2])
✅ 优点:保留原始顺序
❌ 缺点:返回类型是 List,不是 Set,不能直接用于需要 Set 的场景
✅ 推荐使用场景:当你需要保留元素出现的顺序时首选。
4. 使用 distinctBy
扩展函数
当数组中包含的是对象时,我们通常希望根据对象的某个属性进行去重。这时可以使用 distinctBy
方法。
4.1. 定义 Employee
数据类
我们先定义一个简单的数据类:
data class Employee(val id: String, val name: String)
注意:两个员工可以有相同的名字,但 ID 是唯一的。
4.2. 按属性去重
我们来看两个示例:
示例一:按 id
去重
val emp1 = Employee("Jimmy", "1")
val emp2 = Employee("James", "2")
val emp3 = Employee("Jimmy", "3")
val employees = arrayOf(emp1, emp2, emp1, emp3)
val uniqueEmployees = employees.distinctBy { it.id }
assertEquals(3, uniqueEmployees.size)
assertEquals("Jimmy", uniqueEmployees[0].name)
assertEquals("1", uniqueEmployees[0].id)
assertEquals("James", uniqueEmployees[1].name)
assertEquals("2", uniqueEmployees[1].id)
assertEquals("Jimmy", uniqueEmployees[2].name)
assertEquals("3", uniqueEmployees[2].id)
示例二:按 name
去重
val emp1 = Employee("John", "1")
val emp2 = Employee("John", "2")
val employees = arrayOf(emp1, emp2, emp1)
val employeesWithUniqueNames = employees.distinctBy { it.name }
assertEquals(1, employeesWithUniqueNames.size)
assertEquals("John", employeesWithUniqueNames[0].name)
assertEquals("1", employeesWithUniqueNames[0].id)
✅ 优点:灵活,支持按任意属性或逻辑去重
❌ 缺点:需注意 lambda 表达式返回值是否唯一
✅ 推荐使用场景:处理对象数组并根据某个字段或逻辑判断唯一性时首选。
5. 总结
我们介绍了三种在 Kotlin 中去除数组中重复值的方法:
方法 | 是否保留顺序 | 返回类型 | 适用场景 |
---|---|---|---|
toMutableSet() |
❌ | Set | 快速去重,不关心顺序 |
distinct() |
✅ | List | 去重并保留顺序 |
distinctBy() |
✅(可选属性) | List | 对象数组,按属性去重 |
✅ 根据需求选择合适的方法,能显著提升代码的可读性和执行效率。
完整示例代码已上传至 GitHub:Kotlin 去重示例代码(示例链接,非真实地址)