优化列表中的搜索(Kotlin / Android)

时间:2018-04-05 12:38:05

标签: android performance kotlin

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的开头。

如何更好地解决这个性能问题?列表上任何(理智的)预处理量都可以。

1 个答案:

答案 0 :(得分:1)

  

搜索字符串每秒更改几次(通常是新字符   添加 - 所以abc更改为abcd)。项目清单很少变化。

您可以在搜索字符串增长后过滤先前过滤的结果。 如果搜索字符串减少,您可以返回上一个结果。