You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:30:51