Kotlin去重黑科技:distinct的花式玩法大公開!
當你的數據集體"撞衫"怎么辦?
你整理了一筐水果,結果發現蘋果混進去了三次;你統計用戶訂單,結果重復數據像復制粘貼一樣出現...這時候就需要請出Kotlin
家族的"去重小能手"—distinct
!它能像篩子一樣過濾重復項,還你干凈整潔的數據集!
初識distinct:基礎去重三連招
第一式:簡單粗暴去重法
fun main() {
// 水果采購清單(不小心掃了三次蘋果)
val fruits = listOf("??", "??", "??", "??", "??", "??", "??",)
// 使用魔法咒語 distinct!
val uniqueFruits = fruits.distinct()
println("原始清單:$fruits") // [??, ??, ??, ??, ??, ??, ??]
println("去重結果:$uniqueFruits") // [??, ??, ??, ??]
}
效果說明:就像超市掃碼器遇到重復商品會"滴"一聲跳過,distinct
會保留每種元素的第一次出現,后續重復都會被無情過濾!
第二式:數組特攻版
fun main() {
// 員工工號數組(有兩個007重復)
val employeeIds = arrayOf(101, 007, 102, 007, 103) // 改用普通數組
// 正確姿勢:先轉為List再施法
val uniqueIds = employeeIds.toList().distinct()
println("原始工號:${employeeIds.contentToString()}") // [101, 7, 102, 7, 103]
println("去重結果:$uniqueIds") // [101, 7, 102, 103]
}
注意:數組需要先轉為List
才能使用distinct
哦~
? 普通數組(Array<T>類型)需要先通過toList()
轉換
? 基本類型數組(如IntArray
)可直接使用distinct()
,因為Kotlin
偷偷給它們加了超能力?
第三式:對象精準去重術
// 社交媒體好友數據類
dataclassSocialFriend(
val nickname: String,
val account: String
)
fun main() {
// 好友列表(兩個相同賬號的重復關注)
val friends = listOf(
SocialFriend("碼農小明", "coder_123"),
SocialFriend("產品經理小王", "pm_007"),
SocialFriend("測試小美", "coder_123") // 重復賬號!
)
// 按賬號去重的魔法
val realFriends = friends.distinctBy { it.account }
println("真實好友:$realFriends")
// 只會保留第一個"coder_123"對應的對象
}
小貼士:distinctBy
就像智能過濾器,可以指定對象的某個特征作為去重依據!
高階玩法:這些冷知識你知道嗎?
冷知識1:去重也要講武德
distinct
會嚴格保持元素出現的原始順序,就像排隊買奶茶時,黃牛插隊會被識別出來踢出去,但其他人的順序不變
冷知識2:超能力組合技
fun main() {
// 混合類型列表(數字和字符串)
val mixList = listOf(1, "1", 2, "2", 3, "3")
// 先過濾字符串再轉換數字
val numbers = mixList.filterIsInstance<Int>()
.distinct()
.sortedDescending()
println("混合處理結果:$numbers") // [3, 2, 1]
}
組合技解析:distinct
可以和filter
、map
等操作鏈式調用,實現復雜的數據清洗流程!
避坑指南:這些情況要注意!
1. 對象比較陷阱:普通對象默認比較內存地址,要用data class
或重寫equals
方法
2. 大小寫敏感:"Apple"和"apple"會被認為是不同元素,需要預處理統一大小寫
3. 性能問題:超大數據集建議使用toSet()
轉換,效率更高
實戰演練:做個智能購物車
// 購物車商品類
dataclassCartItem(
val sku: String, // 商品唯一編號
val name: String,
var quantity: Int
)
fun main() {
// 模擬用戶重復添加商品
val cart = listOf(
CartItem("1001", "無線耳機", 1),
CartItem("1002", "充電寶", 2),
CartItem("1001", "無線耳機", 1) // 手抖重復添加
)
// 終極去重方案
val cleanCart = cart.distinctBy { it.sku }
.map { it.copy(quantity = 1) } // 重置數量
println("智能購物車:$cleanCart")
}
運行結果:自動合并重復商品,并重置數量為1,有效防止重復下單!
掌握了這些distinct
的妙用,從此告別重復數據煩惱!如果還有其他Kotlin
黑科技想了解,歡迎留言告訴我~ ??