如何使用String.contains最好地搜索java中的字符串列表?

时间:2011-11-07 04:06:00

标签: java android string search

现在我正在使用语音识别来处理Android应用程序。基本上,我想知道一旦我从语音识别中获取String,最好的搜索方法是什么。我目前正在使用packagename列表中的线性搜索,使用以下内容获取该列表:

    pkgNames = new ArrayList<String>();
    pkgAppsList = (ArrayList<ApplicationInfo>) getPackageManager()
            .getInstalledApplications(PackageManager.GET_META_DATA);

    // List available packages on phone.
    for (ApplicationInfo appInfo : pkgAppsList) {

        if (!isSystemPackage(appInfo))
            pkgNames.add(appInfo.packageName);
    }

我认为最好使用ApplicationInfo列表(pkgAppsList)并对其进行搜索,但是有一种更快的方式来搜索该列表,而不仅仅是简单的线性搜索并使用结果打开应用程序有意图。 现在,我能想到的只有:

    for(ApplicationInfo ai: pkgAppsList){
        if((ai.name).contains(voice_recog_result))
           //open Launch Intent for ai.packageName
    }

有没有一种更快的搜索方法,我可以使用contains方法或我可以在没有contains方法的情况下执行此操作?

1 个答案:

答案 0 :(得分:0)

对于少量搜索字符串(应用程序名称),应选择最简单的方法(遍历链表)。

自动增长哈希表通常用于类似的任务,但前提是搜索字符串集通常很大。散列表的最坏情况性能与遍历链表相同(由于自动增长,并且由于大规模散列值冲突的可能性),并且具有不可忽略的开销。因此,对于更长的字符串,“以防万一”保险不是一个很好的选择。

理论上适合此任务的数据结构称为trie。尝试不是JCL或Android库的一部分,而是可用的实现are available。无论字符串的数量如何,trie的最坏情况性能与最长字符串的长度成比例。然而,尝试往往会占用大量内存,这使得它们unsuitable适用于移动环境。