Kotlin .add覆盖MutableList中所有列表项

Cra*_*g P 2 object kotlin mutablelist

我有一个包含可变列表的对象

object TrackingEventsList {
    var EventDate: String = ""
    var EventDescription: String = ""
}

object Waybill {
    var WaybillNumber: String = ""
    var OriginHub: String = ""
    var TrackingEvents: MutableList<TrackingEventsList> = ArrayList()
}
Run Code Online (Sandbox Code Playgroud)

当我尝试添加Waybill.TrackingEvents时,所有先前的实例都被覆盖并复制添加的最后一个TrackingEvent.

private fun fillTracking(events: NodeList) {
    var list = TrackingEventsList
    for (x: Int in 0 until events.length) {
        var tName = (events.item(x) as Element).tagName
        var event = (events.item(x).firstChild as Text).wholeText
        if (tName == "EventDate") {
            list.EventDate = event
        }
        if (tName == "EventDescription") {
            list.EventDescription = event
        }
    }
    Waybill.TrackingEvents.plus(list)
}
Run Code Online (Sandbox Code Playgroud)

调用fillTracking 3次后的结果:

Waybill.TrackingEvents[0].EventDescription = "Event3"
Waybill.TrackingEvents[1].EventDescription = "Event3"
Waybill.TrackingEvents[2].EventDescription = "Event3"
Run Code Online (Sandbox Code Playgroud)

Zoe*_*Zoe 8

object在Kotlin中是一个单例,这意味着你不能初始化它,它只有一个全局实例.因此,当您更改单个实例的项目时,您将覆盖以前的数据.

您应该更改它们(或至少是TrackingEventsList)class.如果Waybill变量是实例敏感的,那么它也必须是一个类.但是在您添加的代码中,我找不到任何可以说您将其用作单例的内容,因此我将其保留为一个.

class TrackingEventsList (
        var eventDate: String = "",
        var eventDescription: String = "")

/**
 * Also want to point out that this is still a singleton. If the data inside is instance-specific, you need to change it 
 * to a class. 
 */
object Waybill {
    var waybillNumber: String = ""
    var originHum: String = ""
    var trackingEvents: MutableList<TrackingEventsList> = ArrayList()
}

private fun fillTracking(events: NodeList) {
    val item = TrackingEventsList()
    for (x: Int in 0 until events.length) {
        var tName = (events.item(x) as Element).tagName
        var event = (events.item(x).firstChild as Text).wholeText

        if (tName == "EventDate") {
            item.eventDate = event
        }
        if (tName == "EventDescription") {
            item.eventDescription = event
        }
    }

    Waybill.trackingEvents.add(item)
}
Run Code Online (Sandbox Code Playgroud)

你应该研究Kotlin的命名约定; 字段永远不会以大写字母开头,除非它是一个静态常量(在这种情况下它是全高的)


MFa*_*o23 5

由于TrackingEventsList是一个对象,这意味着它是一个单例(或只有一个实例)。当您执行循环时,您始终会更新对象的同一实例TrackingEventsList

改成TrackingEventsList这样:

data class TrackingEventsList(var eventDate: String, var eventDescription: String)
Run Code Online (Sandbox Code Playgroud)

每次执行循环时创建一个新实例,然后将其添加到最后的列表中:

private fun fillTracking(events: NodeList) {
    var eventDate: String = ""
    var eventDescription: String = ""
    for (x: Int in 0 until events.length) {
        val tName = (events.item(x) as Element).tagName
        val event = (events.item(x).firstChild as Text).wholeText
        if (tName == "EventDate") {
            eventDate = event
        }
        if (tName == "EventDescription") {
            eventDescription = event
        }
    }
    Waybill.TrackingEvents.plus(TrackingEventsList(eventDate, eventDescription))
}
Run Code Online (Sandbox Code Playgroud)