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 去重示例代码(示例链接,非真实地址)


原始标题:Remove Duplicate Values From an Array in Kotlin