【问题标题】:kotlin arraylist need to update only one itemkotlin arraylist 只需要更新一项
【发布时间】:2021-11-23 09:25:24
【问题描述】:

我试图只更新一项,但下面的代码正在更新全部

logValue("之前的变化:$availabilityMasterList")

                availabilityMasterList.filter { it.days.lowercase() == day.lowercase() }.forEach {
                    it.shifts.add(Shift(shiftname, "", ""))
                }

                logValue("changes broadcast : $availabilityMasterList")

之前和之后的日志输出

之前的更改:[MasterAvailableListData(days=Monday, drsAvailabilityDate=, id=0, shifts=[], edit=false), MasterAvailableListData(days=Tuesday, drsAvailabilityDate=, id=1, shifts=[], edit=假),MasterAvailableListData(天=星期三,drsAvailabilityDate=,id=2,班次=[],编辑=假),MasterAvailableListData(天=星期四,drsAvailabilityDate=,id=3,班次=[],编辑=假),MasterAvailableListData (days=Friday, drsAvailabilityDate=, id=4, shifts=[], edit=false), MasterAvailableListData(days=Saturday, drsAvailabilityDate=, id=5, shifts=[], edit=false), MasterAvailableListData(days=Sunday , drsAvailabilityDate=, id=6, shifts=[], edit=false)]

---------- below output after above query --------------------

2021-11-23 14:50:04.428 30467-30467/com.ohc.admin D/OhcDocHosp: ---------- 更改广播:[MasterAvailableListData(days=Monday, drsAvailabilityDate=, id=0, shifts=[Shift(shiftname=Afternoon, startTime=, endTime=)], edit=false), MasterAvailableListData(days=Tuesday, drsAvailabilityDate=, id= 1, shifts=[Shift(shiftname=Afternoon, startTime=, endTime=)], edit=false), MasterAvailableListData(days=Wednesday, drsAvailabilityDate=, id=2, shifts=[Shift(shiftname=Afternoon, startTime=, endTime =)],edit=false),MasterAvailableListData(days=Thursday,drsAvailabilityDate=,id=3,shifts=[Shift(shiftname=Afternoon,startTime=,endTime=)],edit=false),MasterAvailableListData(days=Friday, drsAvailabilityDate=, id=4, shifts=[Shift(shiftname=Afternoon, startTime=, endTime=)], edit=false), MasterAvailableListData(days=Saturday, drsAvailabilityDate=, id=5, shifts=[Shift(shiftname=Afternoon , startTime=, endTime=)], edit=false), MasterAvailableListData(days=Sunday, drsAvailabilityDate=, id=6, shifts=[Shift(shiftname=Afternoon, startTime=, endTime=)], edit=false)]

【问题讨论】:

  • 我正在尝试每天更新一次
  • 如果在 forEach 中打印元素会发生什么?你确定过滤器只返回一个元素吗?
  • 我将代码更改如下)) logValue("it day : ${it.days} "+"\\n"+" ${it.shifts}") } 这是输出 it day : Monday \n [Shift(shiftname=Afternoon, startTime =, endTime=)]
  • 很奇怪……反正不要用filter和forEach,用first()或者firstOrNull

标签: android kotlin arraylist


【解决方案1】:

我高度怀疑每个 MasterAvailableListData 项对同一个空班次列表的引用完全相同。因此,如果您将班次添加到任何项目的班次列表中,它看起来就像您将其添加到所有项目,因为它实际上是同一个列表。确保创建 MasterAvailableListData 项目,每个项目都有自己的初始空班次列表

【讨论】:

  • 它是真的,当我改变它的工作时,我添加了 mutableListOf() 的相同实例,非常感谢
【解决方案2】:

奇怪的是它只返回一个元素并且整个列表都被更新了......

如果您只需要更新一个项目,请使用 firstOrNull

做这样的事


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

firstOrNull 将返回匹配的值(如果有),否则返回 null

您不需要对结果进行迭代,因为您将获得项目而不是列表。

?.申请

它会阻止空指针并仅当项目存在于列表中时才更新项目。 apply 也会返回元素,你不需要使用 itthis 来引用对象。

顺便说一句,如果您需要不区分大小写的比较,您可以使用带有 ignoreCase 的 equals 函数 参数。 (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/equals.html)

"example".equals("EXAMPLE", ignoreCase = true)

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 2020-10-07
    • 2022-11-01
    • 2016-06-11
    • 1970-01-01
    • 2013-10-27
    • 2021-05-17
    • 2014-03-05
    相关资源
    最近更新 更多