Kotlin中对ArrayList对象按currency分组去重失效问题求助
Kotlin中ArrayList按currency分组去重问题解决
问题描述
现有如下JSON数据:
{ "securityAccountList": [ { "accountNumber": "001548900001", "accountName": "Tjandraningrum", "currency": "IDR", "debtInstrument": "0", "equityInstrument": "0" }, { "accountNumber": "001548900001", "accountName": "Tjandraningrum", "currency": "IDR", "debtInstrument": "0", "equityInstrument": "0" }, { "accountNumber": "001548900001", "accountName": "Tjandraningrum", "currency": "USD", "debtInstrument": "22", "equityInstrument": "66" } ] }
通过GSON生成对应的数据类:
data class ContentModel( @SerializedName("securityAccountList") var securityAccountList: ArrayList<SecurityAccountList> = arrayListOf() ) data class SecurityAccountList( @SerializedName("accountNumber") var accountNumber: String? = null, @SerializedName("accountName") var accountName: String? = null, @SerializedName("currency") var currency: String? = null, @SerializedName("debtInstrument") var debtInstrument: String? = null, @SerializedName("equityInstrument") var equityInstrument: String? = null )
尝试按currency字段分组并保留每个currency仅一条数据,但执行以下代码后,列表仍为3条数据,未达预期:
val newSecurityAccountList = contentModel.securityAccountList newSecurityAccountList.groupingBy { it.currency } newSecurityAccountList.sortBy { it.currency }
问题原因
groupingBy仅创建分组操作的中间容器,不会修改原列表,也不会返回去重后的集合,且你未接收其返回值或做后续处理。sortBy仅对原列表按currency排序,不具备去重能力,因此列表长度无变化。
解决方案
方法1:groupBy + 取每组首个元素
groupBy返回以currency为key、对应分组列表为value的Map,遍历Map取每组首个元素组成新列表:
val groupedList = contentModel.securityAccountList .groupBy { it.currency } .values .map { it.first() } .toArrayList()
方法2:直接使用distinctBy(简洁高效)
若仅需按currency去重并保留首次出现的元素,distinctBy是最优选择:
val distinctList = contentModel.securityAccountList .distinctBy { it.currency } .toArrayList()
注:若需保留每组最后一个元素,可将
it.first()替换为it.last()(对应方法1),或先反转列表再用distinctBy。
方法3:排序+去重组合
若需要先按currency排序再去重:
val sortedDistinctList = contentModel.securityAccountList .sortedBy { it.currency } .distinctBy { it.currency } .toArrayList()
内容的提问来源于stack exchange,提问作者Amay Diam
相关产品推荐
相关产品推荐

