Android,Kotlin 1.2。 我有像
这样的代码data class Item(val id:Int,val field1:String, val field3:Array<String>,val field2:String)
val items:List<Item> = ....
var str:String='string_to_search'
我需要通过str过滤项目列表,所以我得到包含onyly项目的子列表,其中str是字段1或字段2或两者的不区分大小写的子字符串(它与哪个匹配或精确偏移无关紧要) 。 现在我使用这样的代码:
filteredItems=items
.filter { filtertFunc(it,filter) }
...
fun filtertFunc(item: Item, filter:String):Boolean {
if (item.field1.contains(filter, ignoreCase = true)) {
return true
}
if (item.field2.contains(filter, ignoreCase = true)) {
return true
}
return false
}
项目列表通常包含2-3k项目。 field1和field2通常通常为30-300。搜索字符串为0-50个字符。 搜索字符串每秒更改几次(通常添加新字符 - 因此abc更改为abcd)。项目清单很少变化。
我的代码在某些设备上有性能(过滤器需要几秒钟,这很糟糕)。
我无法使用.parallelStream(我需要支持Android 5.x,但设备通常至少有2个内核)。
在Item +过滤器中使用并行映射(来自Parallel operations on Kotlin collections?)+特殊标志字段并没有多大帮助。
我考虑过使用人工键(field1 + field3)(或排序列表并使用binarySearch)添加哈希映射,但这不会有帮助,因为搜索字符串不一定出现在field1 / field3的开头。
如何更好地解决这个性能问题?列表上任何(理智的)预处理量都可以。
答案 0 :(得分:1)
搜索字符串每秒更改几次(通常是新字符 添加 - 所以abc更改为abcd)。项目清单很少变化。
您可以在搜索字符串增长后过滤先前过滤的结果。 如果搜索字符串减少,您可以返回上一个结果。