如何在特定索引中添加新项?

时间:2018-05-14 01:05:26

标签: collections kotlin

我是kotlin的新手,我想更新列表中的项目。 我使用这段代码:

var index: Int
    for (record in recordList)
        if (record.id == updatedHeader?.id) {
            index = recordList.indexOf(record)
            recordList.add(index, updatedHeader)
        }

但由于ConcurrentModificationException

,它无法做到这一点

2 个答案:

答案 0 :(得分:2)

假设recordListMutableListval(因此,您希望修改记录),可以使用forEachIndexed查找您关心的记录并替换它们。

这不会导致ConcurrentModificationException

recordList.forEachIndexed { index, record -> 
    if(record.id == updatedHeader?.id) recordList[index] = updatedHeader
}

另一方面,如果您将recordList重新定义为非可变列表和var,则可以使用map重写整个列表:

recordList = recordList.map { if(it.id == updatedHeader?.id) updatedHeader else it }

当然,如果您想将.toMutableList()变成List,可以在结束时致电MutableList

答案 1 :(得分:0)

如果列表中包含给定id的单个记录,您可以找到其索引并在该索引处添加标题:

    val index = recordList.indexOfFirst { it.id == updatedHeader.id }
    if (index >= 0)
        recordList.add(index, updatedHeader)

如果有多个具有给定ID的记录,并且您希望在每个记录之前添加标头,则可以使用get listIterator并使用其方法在迭代期间修改列表而不获取ConcurrentModificationException

    val iterator = recordList.listIterator()
    for (record in iterator) {
        if (record.id == updatedHeader.id) {
            iterator.previous()  // move to the position before the record
            iterator.add(updatedHeader) // prepend header
            iterator.next() // move next, back to the record
        }
    }