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

Kotlin操作ArrayList仅更新单个条目却修改全部条目的问题求解

问题原因

该问题的核心是所有MasterAvailableListData实例的shifts字段引用了同一个可变列表对象:
你在初始化列表时,应该是预先创建了一个公共的空shifts列表,再将这个列表实例赋值给了所有MasterAvailableListData的shifts属性。Kotlin中对象是引用传递,你对任意一个实例的shifts列表做修改,本质都是修改同一个内存地址的列表对象,因此所有条目的shifts都会同步变更。你写的过滤逻辑本身是正常的,只是修改的目标列表是全局共享的,才会出现全部条目被修改的现象。

修复方案

1. 修正数据初始化逻辑

给每个MasterAvailableListData实例单独创建独立的shifts列表,禁止复用同一个列表实例。
错误示例:

// 错误:所有实例复用同一个列表
val commonEmptyShifts = mutableListOf<Shift>()
val availabilityMasterList = listOf(
    MasterAvailableListData(days = "Monday", drsAvailabilityDate = "", id = 0, shifts = commonEmptyShifts, edit = false),
    MasterAvailableListData(days = "Tuesday", drsAvailabilityDate = "", id = 1, shifts = commonEmptyShifts, edit = false),
    // 剩余条目均复用commonEmptyShifts
)

正确示例:

// 正确:每个实例单独创建新的空列表
val availabilityMasterList = listOf(
    MasterAvailableListData(days = "Monday", drsAvailabilityDate = "", id = 0, shifts = mutableListOf(), edit = false),
    MasterAvailableListData(days = "Tuesday", drsAvailabilityDate = "", id = 1, shifts = mutableListOf(), edit = false),
    // 剩余条目均单独创建新的mutableListOf()
)

2. 可选优化业务代码

如果确认每天只会有一个匹配的条目,可以用firstOrNull替代filter + forEach,减少不必要的遍历:

availabilityMasterList.firstOrNull { 
    it.days.equals(day, ignoreCase = true) 
}?.shifts?.add(Shift(shiftname, "", ""))

内容的提问来源于stack exchange,提问作者karteek thati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:06:00