内有另一个循环时,列表​​项的迭代速度太慢

时间:2019-06-26 16:03:19

标签: android kotlin

我有两个列表,一个列出了所有可能的设备,另一个列出了仅几个设备。我需要在这种情况下通过最终名单: 如果完整列表==较小列表中的一项,则将该项目的“活动”设置为true,否则将其保留为false。

当使用完整列表> 500的设备和较小列表> 50的设备时,我没有问题,但是例如,当我拥有2000个设备时,一切开始变得太慢了(在Google Pixel 2XL上,我需要等待大约6秒钟才能完成工作)。

问题:如何提高循环速度?

到目前为止我所做的:

devicesList.forEach { device ->

            device.selected = false

            items.forEach { it ->
                if(it.id == device.id){
                    device.selected = true
                }
            }

但这对于较大的数据来说太慢了

2 个答案:

答案 0 :(得分:1)

您可以不使用forEach来加快速度,id使用插入器,而不是使用for循环。假设for (i in 0 until devicesList.size) { val device = devicesList[i] for (j in 0 until items.size) { val item = items[j] if (item.id == device.id) { device.selected = true break } } } 是唯一的,您也可以破坏它们

id

假设您的items是唯一的,您还可以复制val copy = items.toMutableList() for (i in 0 until devicesList.size) { val device = devicesList[i] for (j in 0 until copy.size) { val item = copy[j] if (item.id == device.id) { device.selected = true copy.remove(item) break } } } 列表,并删除已定位的列表,这样每个循环都较短,就像这样

key

您还可以考虑创建一个id是您的id的地图,这样就不必循环,而可以直接由val map = items.associateBy { it.id } for (i in 0 until devicesList.size) { val device = devicesList[i] device.selected = map[device.id] != null } 检索该项目。首先,您必须权衡创建地图的成本。

test_str = "123456"
print(test_str[:-3])
print(test_str[3:])
print(test_str[2:4])

除此之外,您还应该将逻辑移至后台线程并等待其完成。

答案 1 :(得分:0)

如果列表selected = true中存在设备id,则只需将items设为items,就可以像这样获得val ids = items.map { it.id } 的所有ID:

devices

,然后遍历devicesList.forEach { it.selected = it.id in ids }

zip()