kotlin 我在默认调度程序java.util.ConcurrentModificationException中同时执行更新项和排序的操作

pinkon5k  于 2023-08-06  发布在  Kotlin
关注(0)|答案(2)|浏览(180)

当我使用Default Dispatcher更新列表中的项目并对列表进行排序时,我有时会遇到java.util.ConcurrentModificationException错误。问题是我必须做两个不同的默认调度程序代码块,一个用于更新列表中的项目,另一个用于对列表中的项目进行排序。
代码:-

withContext(Dispatchers.Default) {
                for (item in listOfLocation) {
                    val distanceInMeter = ClsGlobel.calculateDistance(
                        item.lat, item.lon, it.latitude, it.longitude
                    ) * 1000
                    listOfLocation[listOfLocation.indexOf(item)] =
                        SavedLocation(item.id, item.lat, item.lon, distanceInMeter, item.areaName)
                }

                listOfLocation.sortBy { it.distance }
                Log.e(
                    "tag", " Default: "
                            + Thread.currentThread().name
                )
            }

字符串

3zwtqj6y

3zwtqj6y1#

java.util.concurrentmodificationexception在Java中是一个错误。当迭代器遍历一个列表,并且在遍历过程中使用了一个命令来改变元素的值时,就会发生错误
似乎你的listOfLocation太大了。而你却在它还在进行的时候就把它分类
尝试这样的事情。asSequence

listOfLocation
    .asSequence
    .map{
        //calculate distanceInMeter etc
    }
    .sortBy { it.distance }

字符串
为什么要使用Default Dispatcher?使用IO

ddrv8njm

ddrv8njm2#

这与协程或线程无关。您正在修改列表,同时使用其迭代器对其进行迭代(“并发修改”),这是不允许的。在使用List的Iterator的for循环中迭代List时,不能对List进行变异。
因此,将其更改为不使用List的迭代器。更改此项:

for (item in listOfLocation) {
    val distanceInMeter = ClsGlobel.calculateDistance(
            item.lat, item.lon, it.latitude, it.longitude
        ) * 1000
    listOfLocation[listOfLocation.indexOf(item)] =
        SavedLocation(item.id, item.lat, item.lon, distanceInMeter, item.areaName)
}

字符串

for (i in listOfLocation.indices) {
    val item = listOfLocation[i]
    val distanceInMeter = ClsGlobel.calculateDistance(
            item.lat, item.lon, it.latitude, it.longitude
        ) * 1000
    listOfLocation[i] =
        SavedLocation(item.id, item.lat, item.lon, distanceInMeter, item.areaName)
}


时间复杂度:O(n)= O(n)

相关问题