我有两个列表,一个列出了所有可能的设备,另一个列出了仅几个设备。我需要在这种情况下通过最终名单: 如果完整列表==较小列表中的一项,则将该项目的“活动”设置为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
}
}
但这对于较大的数据来说太慢了
答案 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()